Hoe dubbele records in een Firebird-database te vinden en te verwijderen
DELETE-opdracht (zoals gedefinieerd in de SQL-standaard) verwijdert altijd alle records die aan de voorwaarde voldoen. Meestal willen we een van de duplicaten behouden en de andere verwijderen. Om dit te doen, moeten we RDB$DB_KEY gebruiken - een impliciet fysiek recordnummer in een Firebird-database, dat kan worden gebruikt om een kunstmatig verschil te creëren tussen identieke records.
DELETE FROM XXX T1 WHERE EXISTS (SELECT * FROM XXX T2 WHERE (T2.column1 = T1.column1 of (T2.column1 is null en T2.column1 is null)) EN (T2.column2 = T1.column2 of (T2.column2 is null en T2.column2 is null)) EN (.......) EN (T2.RDB$DB_KEY > T1.RDB$DB_KEY))
In dit geval gebruiken we de fysieke RDB$DB_KEY om 2 records met identieke inhoud in gespecificeerde velden (column1, column2, enz.) te onderscheiden, en het record met de grotere RDB$DB_KEY.
Om duplicaten te vinden, kunt u de volgende query met de RDB$DB_KEY-voorwaarde gebruiken:
SELECT * FROM TABLE T1 WHERE EXISTS (SELECT FIELD FROM TABLE T2 WHERE T1.FIELD = T2.FIELD EN T1.RDB$DB_KEY != T2.RDB$DB_KEY)