web-dev-qa-db-ja.com

最速の「Get Duplicates」SQLスクリプト

何十万ものレコードを持つデータセットで重複を取得する高速SQLの例は何ですか。私は通常次のようなものを使用します:

SELECT afield1, afield2 FROM afile a 
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1);

しかし、これはかなり遅いです。

43
Johan Bresler

これはより直接的な方法です:

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1
78
Vinko Vrsalovic

あなたは試すことができます:

select afield1, afield2 from afile a
where afield1 in
( select afield1
  from afile
  group by afield1
  having count(*) > 1
);
16
Tony Andrews

同様の質問が先週行われました。そこにはいくつかの良い答えがあります。

グループ内で重複するエントリを見つけるSQL)

その質問では、OPはテーブル(ファイル)のすべての列(フィールド)に関心がありましたが、行が同じキー値(afield1)を持っている場合、行は同じグループに属していました。

答えには次の3種類があります。

where句のサブクエリ。ここにある他のいくつかの回答と同様です。

テーブルとテーブルとして表示されるグループ間の内部結合(私の答え)

分析クエリ(私にとって新しいもの)。

5
Walter Mitty

ちなみに、誰かが重複を削除したい場合は、これを使用しました:

delete from MyTable where MyTableID in (
  select max(MyTableID)
  from MyTable
  group by Thing1, Thing2, Thing3
  having count(*) > 1
)
5
Magnus Smith

これはかなり高速でなければなりません(dupeFieldsにインデックスが付けられている場合はさらに高速です)。

_SELECT DISTINCT a.id, a.dupeField1, a.dupeField2
FROM TableX a
JOIN TableX b
ON a.dupeField1 = b.dupeField2
AND a.dupeField2 = b.dupeField2
AND a.id != b.id
_

このクエリの唯一の欠点は、あなたがCOUNT(*)を実行していないため、回数を確認できないことです。一度より。

4
Simon East