Deze pagina is automatisch vertaald. Lees het Engelse origineel. English

IBSurgeon-bibliotheek

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)