Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. English

Бібліотека IBSurgeon

Як знайти та видалити дублікати записів у базі даних 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)