Hallo Acces-o-Mania!
Ich habe nochmals ein SQL Problem: Es sollen alle doppelten Datensätze aus der Datenbank gelöscht werden, bis nur noch ein Eintrag übrig bleibt.
Meine Datenbank enthält eine große Anzahl an Einträgen. Im Folgenden ein paar Beispiele:
ID | Col1Name [Varchar(255)] | Col2Name [Varchar(255)] | Col3Name [Bit] | Col4Name [Bit] | Col5Name [Longtext] |
1 | A1 | B1 | False | False | Text... |
2 | A1 | B2 | False | False | Text... |
3 | A2 | B1 | False | False | Text... |
4 | A2 | B1 | True | False | Text... |
Zitat
Anmerkung:
Col1Name und Col2Name sind beide als NOT NULL gesetzt, enthalten also zwangsläufig eine Zeichenfolge.
Gelöscht werden soll, wo Col1Name und Col2Name gleich sind. Die Bits und der LongText können auch verschieden sein. Hier im Beispiel sollte also einer der beiden Einträge mit Col1Name=A2 und Col2Name=B1 gelöscht werden. Wenn ich mir aussuchen kann, welcher übrig bleiben soll, dann am besten der neuste (höchste ID).
Mein aktuellers SQL Statement sieht wie folgt aus:
DELETE FROM TableName AS A
WHERE A.ID IN (
SELECT B.ID FROM TableName AS B
WHERE (
NOT B.ID=A.ID
AND B.Col1Name=A.Col1Name
AND B.Col2Name=A.Col2Name
)
);
Beim Ausführen wird aber überhaupt kein Eintrag gelöscht. Wisst Ihr wo hier der Fehler liegt?
Vielen Dank für Eure Hilfe! :)
FuzzyHair
Vermutlich geht's so.DELETE FROM TABLENAME a
WHERE id <
( SELECT Max( id )
FROM TABLENAME
WHERE col1name = a.col1name AND
col2name = a.col2name );