@ erwin-brandstetterのソリューションが好きですが、USING
を使用してソリューションを示したかったのです。 キーワード:
DELETE FROM table_with_dups T1
USING table_with_dups T2
WHERE T1.ctid < T2.ctid -- delete the "older" ones
AND T1.name = T2.name -- list columns that define duplicates
AND T1.address = T2.address
AND T1.zipcode = T2.zipcode;
レコードを削除する前に確認する場合は、DELETE
を置き換えるだけです。 SELECT *
を使用 およびUSING
カンマ付き,
、つまり
SELECT * FROM table_with_dups T1
, table_with_dups T2
WHERE T1.ctid < T2.ctid -- select the "older" ones
AND T1.name = T2.name -- list columns that define duplicates
AND T1.address = T2.address
AND T1.zipcode = T2.zipcode;
更新:ここで、速度についてさまざまなソリューションのいくつかをテストしました。多くの重複が予想されない場合、このソリューションは、NOT IN (...)
を持つソリューションよりもはるかに優れたパフォーマンスを発揮します。 サブクエリで多くの行を生成するため、句。
IN (...)
を使用するようにクエリを書き直した場合 次に、ここに示すソリューションと同様に機能しますが、SQLコードははるかに簡潔になります。
更新2:NULL
がある場合 キー列の1つに値がある場合(実際にはIMOにすべきではありません)、COALESCE()
を使用できます。 その列の条件で、例:
AND COALESCE(T1.col_with_nulls, '[NULL]') = COALESCE(T2.col_with_nulls, '[NULL]')