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

一意の識別子なしで重複する行を削除する方法

    @ 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]')
    


    1. パラメータスニッフィングウェビナーシリーズのQ&A

    2. GaleraクラスターでSST操作を停止またはスロットルする方法

    3. JDBC接続に失敗しました、エラー:ホストへのTCP/IP接続に失敗しました

    4. Access2019ScreenTipsの使用方法