最速の「Get Duplicates」SQLスクリプト
-
10-07-2019 - |
質問
何十万ものレコードを持つデータセットで重複を取得する高速SQLの例は何ですか。私は通常次のようなものを使用します:
SELECT afield1, afield2 FROM afile a
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1);
しかし、これは非常に遅いです。
解決
これはより直接的な方法です:
select afield1,count(afield1) from atable
group by afield1 having count(afield1) > 1
他のヒント
試すことができます:
select afield1, afield2 from afile a
where afield1 in
( select afield1
from afile
group by afield1
having count(*) > 1
);
先週、同様の質問がされました。良い答えがいくつかあります。
その質問では、OPはテーブル(ファイル)のすべての列(フィールド)に関心がありました。 ただし、キー値(afield1)が同じ場合、行は同じグループに属していました。
3種類の回答があります:
ここにある他の回答のいくつかのように、where句のサブクエリ。
テーブルとテーブルとして表示されるグループ間の内部結合(私の答え)
および分析クエリ(私にとって新しいもの)。
ところで、誰かが重複を削除したい場合、私はこれを使用しました:
delete from MyTable where MyTableID in (
select max(MyTableID)
from MyTable
group by Thing1, Thing2, Thing3
having count(*) > 1
)
これは適度に高速でなければなりません(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(*)
を実行していないため、回数を確認できないことです複製されますが、複数回表示されます。
所属していません StackOverflow