So finden und löschen Sie doppelte Datensätze in einer Firebird-Datenbank
DELETE-Befehl (wie im SQL-Standard definiert) löscht immer alle Datensätze, die die Bedingung erfüllen. Normalerweise möchten wir einen der Duplikate behalten und die anderen löschen. Dazu müssen wir RDB$DB_KEY verwenden - eine implizite physische Datensatznummer in der Firebird-Datenbank, die verwendet werden kann, um einen künstlichen Unterschied zwischen identischen Datensätzen zu erzeugen.
DELETE FROM XXX T1 WHERE EXISTS (SELECT * FROM XXX T2 WHERE (T2.column1 = T1.column1 or (T2.column1 is null and T2.column1 is null)) AND (T2.column2 = T1.column2 or (T2.column2 is null and T2.column2 is null)) AND (.......) AND (T2.RDB$DB_KEY > T1.RDB$DB_KEY))
In diesem Fall verwenden wir die physische RDB$DB_KEY, um zwei Datensätze mit identischem Inhalt in den angegebenen Feldern (column1, column2 usw.) zu unterscheiden, und den Datensatz mit der größeren RDB$DB_KEY.
Um Duplikate zu finden, können Sie die folgende Abfrage mit der RDB$DB_KEY-Bedingung verwenden:
SELECT * FROM TABLE T1 WHERE EXISTS (SELECT FIELD FROM TABLE T2 WHERE T1.FIELD = T2.FIELD AND T1.RDB$DB_KEY != T2.RDB$DB_KEY)