MSSQL-doppelte Einträge löschen


Alfred_

Erfahrenes Mitglied
#1
Hi,
der folgende Arbeitsauftrag wird mir mit:In der Nähe von ',' wurde ein nicht boolscher Ausdruck in einem Kontext angegeben, in denen eine Bedingung erwartet wird.
Falscher Syntax in der Nähe von '1', verweigert.

Code:
      Dim com As New SqlCommand("DELETE FROM finaldaten07 WHERE Z1, Z2, Z3, Z4, Z5, Z6, Z7 IN (SELECT Z1, Z2, " + _
                                "Z3, Z4, Z5, Z6, Z7 FROM finaldaten07 GROUP BY Z1, Z2, Z3, Z4, Z5, Z6, Z7 " + _
                                "HAVING COUNT(*) > 1", myConn)
Für eine Unterstützung wäre ich sehr dankbar.
Grüße
 
Zuletzt bearbeitet:

Alfred_

Erfahrenes Mitglied
#3
Hallo Spyke,
danke für Deine Bemühungen, ist noch nicht optimal. Zumindest ist die Fehlermeldung: Falscher Syntax in Nähe von #1' weg.
Kann auch sein, dass ich den Klammerausdruck falsch gesetzt habe.
Meine Ergänzung:
Dim com As New SqlCommand("DELETE FROM finaldaten07 WHERE Z1, Z2, Z3, Z4, Z5, Z6, Z7 IN (SELECT Z1, Z2, Z3, Z4, Z5, Z6, Z7 FROM finaldaten07 GROUP BY Z1, Z2, Z3, Z4, Z5, Z6, Z7 " + _
"HAVING COUNT(*) > 1)", myConn)
Grüße
 
#4
Im Prinzip hast du jetzt auch nur eine WHERE Bedinung für Z7 angegeben.
Z1 bis Z6 gibst du erstmal nur so an ohne irgendwas, was höchst wahrscheinlich der Syntaxfehler sein wird.
Probiers mal nur mit Z7 allein.
 

Alfred_

Erfahrenes Mitglied
#5
Hallo und Danke.
Habe eine in vb@archiv gefundene VB6 Routine adaptiert, die momentan für meine Ansprüche ausreichend ist. Ca. 3000 Datensätze.
Deine Lösungsansätze werde ich weiter verfolgen. Allerdings soll auch das vor dem Sub Select stehende IN nur eine Bedingung akzeptieren. Ich muss mich mehr informieren.
Wenn ich nicht mehr weiter weiss, werde ich wieder auf Die zugehen.
Vielen herzlichen Dank
Code:
    Dim da As New SqlDataAdapter
    da = New SqlDataAdapter("SELECT * FROM finaldaten07 ORDER BY Z1 ASC, Z2 ASC, Z3 ASC, " + _
                            "Z4 ASC, Z5 ASC, Z6 ASC, Z7 ASC, nr ASC", myConn)
    Dim cb As New SqlCommandBuilder(da)
    Dim dt As DataTable
    dt = New DataTable("finaldaten07")
    da.Fill(dt)
    Dim i As Integer

    Dim sPrev01 As String, sPrev02 As String, sPrev03 As String, sPrev04 As String, sPrev05 As String
    Dim sPrev06 As String, sPrev07 As String

    sPrev01 = CStr(0) : sPrev02 = CStr(0) : sPrev03 = CStr(0) : sPrev04 = CStr(0) : sPrev05 = CStr(0)
    sPrev06 = CStr(0) : sPrev07 = CStr(0)

    Try
      myConn.Open()
        For Each Row As DataRow In dt.Rows

          If Len(sPrev01) = 0 _
          And Len(sPrev02) = 0 _
          And Len(sPrev03) = 0 _
          And Len(sPrev04) = 0 _
          And Len(sPrev05) = 0 _
          And Len(sPrev06) = 0 _
          And Len(sPrev07) = 0 Then
            sPrev01 = CStr(Row!Z1)
            sPrev02 = CStr(Row!Z2)
            sPrev03 = CStr(Row!Z3)
            sPrev04 = CStr(Row!Z4)
            sPrev05 = CStr(Row!Z5)
            sPrev06 = CStr(Row!Z6)
            sPrev07 = CStr(Row!Z7)
          Else
            If CStr(Row!Z1) = sPrev01 _
            And CStr(Row!Z2) = sPrev02 _
            And CStr(Row!Z3) = sPrev03 _
            And CStr(Row!Z4) = sPrev04 _
            And CStr(Row!Z5) = sPrev05 _
            And CStr(Row!Z6) = sPrev06 _
            And CStr(Row!Z7) = sPrev07 Then
              Row.Delete()
            Else
              sPrev01 = CStr(Row!Z1)
              sPrev02 = CStr(Row!Z2)
              sPrev03 = CStr(Row!Z3)
              sPrev04 = CStr(Row!Z4)
              sPrev05 = CStr(Row!Z5)
              sPrev06 = CStr(Row!Z6)
              sPrev07 = CStr(Row!Z7)
            End If
          End If
          i += 1
        Next
        da.Update(dt)
    Catch sqlExc As SystemException
      MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
      MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
      myConn.Close()
    End Try