sql >> データベース >  >> RDS >> PostgreSQL

テーブル内の重複を削除するにはどうすればよいですか?

    これにより、重複の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が示しているように、重複のない新しいテーブルを作成する方がはるかに高速です。



    1. MySQLの正規表現のユーザー入力をエスケープする最良の方法は何ですか?

    2. 選択したポイントから特定の距離にあるすべてのアドレスを見つけるための最良のアプローチは何ですか

    3. mysqlでの正規表現マッチングの16進文字

    4. SQLiteからOracleへ