このページは機械翻訳されています。英語の原文をお読みください。 English

IBSurgeon ライブラリ

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)