Firebirdデータベースで重複レコードを検索して削除する方法
DELETEコマンド(SQL標準で定義されている通り)は、常に条件を満たすすべてのレコードを削除します。通常、重複のうち1つを残して他を削除したいものです。そのためには、Firebirdデータベースにおける暗黙の物理レコード番号であるRDB$DB_KEYを使用する必要があります。これにより、同一のレコード間に人為的な違いを作り出すことができます。
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))
この場合、指定されたフィールド(column1、column2など)で同一の内容を持つ2つのレコードを区別するために物理的なRDB$DB_KEYを使用し、より大きい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)