Jak znaleźć i usunąć zduplikowane rekordy w bazie danych Firebird
Polecenie DELETE (zgodnie z definicją w standardzie SQL) zawsze usuwa wszystkie rekordy spełniające warunek. Zazwyczaj chcemy pozostawić jeden z duplikatów i usunąć pozostałe. Aby to zrobić, musimy użyć RDB$DB_KEY - niejawnego fizycznego numeru rekordu w bazie danych Firebird, który można wykorzystać do stworzenia sztucznej różnicy między identycznymi rekordami.
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))
W tym przypadku używamy fizycznego RDB$DB_KEY, aby rozróżnić 2 rekordy o identycznej zawartości w określonych polach (column1, column2 itd.) i rekord z większym RDB$DB_KEY.
Aby znaleźć duplikaty, możesz użyć następującego zapytania z warunkiem 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)