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)