Cette page a été traduite automatiquement. Lisez l'original en anglais. English

Bibliothèque IBSurgeon

Comment trouver et supprimer les enregistrements en double dans une base de données Firebird

La commande DELETE (telle qu’elle est définie dans la norme SQL) supprime toujours tous les enregistrements qui satisfont la condition. En général, nous voulons conserver l’un des doublons et supprimer les autres. Pour ce faire, nous devons utiliser RDB$DB_KEY - un numéro d’enregistrement physique implicite dans la base de données Firebird, qui peut être utilisé pour créer une différence artificielle entre des enregistrements identiques.

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))

Dans ce cas, nous utilisons le RDB$DB_KEY physique pour distinguer 2 enregistrements ayant un contenu identique dans les champs spécifiés (column1, column2, etc.), et l’enregistrement avec le RDB$DB_KEY le plus grand.

Pour trouver les doublons, vous pouvez utiliser la requête suivante avec la condition RDB$DB_KEY :

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)