これにより、重複の1つが保持されます:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
テーブルには、「1人の生存者を選ぶ」ために使用できる一意の識別子がありません。そこで、Postgresのctid
各行の内部一意識別子であるため、便利です。 ctid
は絶対に使用しないでください。 単一のステートメント以上のもの。これは普遍的にユニークなものではありませんが、単一のステートメントの実行時間には問題ありません。
SQLFiddleの例: http://sqlfiddle.com/#!15/dabfc/1 >
すべてを取り除きたい場合 重複する行:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
どちらのソリューションも、大きなテーブルでは高速ではありません。大きなテーブルからかなりの数の行が必要な場合は、jjanesが示しているように、重複のない新しいテーブルを作成する方がはるかに高速です。