Как найти и удалить дублирующиеся записи в базе данных Firebird
Команда DELETE (как она определена в стандарте SQL) всегда удаляет все записи, удовлетворяющие условию. Обычно мы хотим оставить одну из дублирующихся записей и удалить остальные. Для этого нужно использовать RDB$DB_KEY - неявный физический номер записи в базе данных Firebird, который можно использовать для создания искусственного различия между идентичными записями.
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))
В этом случае мы используем физический RDB$DB_KEY, чтобы различить 2 записи с идентичным содержимым в указанных полях (column1, column2 и т.д.), и запись с большим значением RDB$DB_KEY.
Чтобы найти дубликаты, вы можете использовать следующий запрос с условием 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)