Questa pagina è stata tradotta automaticamente. Leggi l'originale in inglese. English

Libreria IBSurgeon

Come trovare ed eliminare record duplicati in un database Firebird

Il comando DELETE (come definito nello standard SQL) elimina sempre tutti i record che soddisfano la condizione. Di solito, vogliamo lasciare uno dei duplicati ed eliminare gli altri. Per farlo, dobbiamo usare RDB$DB_KEY - un numero fisico implicito del record nel database Firebird, che può essere utilizzato per creare una differenza artificiale tra record identici.

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 questo caso, stiamo usando il RDB$DB_KEY fisico per distinguere 2 record con contenuti identici nei campi specificati (column1, column2, ecc.), e il record con il RDB$DB_KEY più grande.

Per trovare i duplicati puoi usare la seguente query con la condizione 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)