1

を使用して削除できるように、テーブル内の重複行の ID のリストを取得する必要がありますwhere id in。これが私のテーブルです:

id|col1|col2
1 |22  | text
2 |22  | text
3 |23  | text
4 |22  | text2

したがって、ここでは id12は重複していますが、その他は重複していません。だから私はそれらを使用してそれらを取得する方法を知っていますgroup by and having count(*) > 1

しかし、私は1つを保持し、他のものを削除したい. したがって、これは、重複のパージ後にこのテーブルがどのように見えるかです:

    id|col1|col2
    1 |22  | text
    3 |23  | text
    4 |22  | text2

また :

id|col1|col2
2 |22  | text
3 |23  | text
4 |22  | text2

どちらでもいいです。これどうやってするの?重複を取り除きますが、最後に重複の 1 つを保持して、もう重複しないようにしますか?

私の次の目標は、これらのフィールドにインデックスを追加して、これが再び起こらないようにすることです。

4

3 に答える 3

0

これは少し遅いかもしれないと思います

DELETE FROM tab
NATURAL JOIN 
(
   SELECT DISTINCT ON(col2, col3) id AS target, col2, col3
   FROM tab
   ORDER by col2, col3 /* can add order by id if you care which is kept */
) AS subq WHERE tab.id <> subq.target; 

しかし、サンプルデータで試してみてください。

于 2013-09-18T15:41:20.823 に答える