43

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

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

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

4

5 に答える 5

78

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

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1
于 2008-10-13T09:38:27.877 に答える
16

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

select afield1, afield2 from afile a
where afield1 in
( select afield1
  from afile
  group by afield1
  having count(*) > 1
);
于 2008-10-13T09:39:11.777 に答える
5

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

delete from MyTable where MyTableID in (
  select max(MyTableID)
  from MyTable
  group by Thing1, Thing2, Thing3
  having count(*) > 1
)
于 2011-01-20T21:57:05.180 に答える
5

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

重複するエントリを検索するための SQL (グループ内)

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

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

ここにある他のいくつかの回答のように、where句のサブクエリ。

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

および分析クエリ (私には新しいもの)。

于 2008-10-13T12:50:35.667 に答える
4

これはかなり高速です (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(*)確認できず、複数回表示されることだけだと思います。

于 2012-08-21T05:39:16.453 に答える