最快的“获取重复”SQL脚本

时间:2008-10-13 09:36:18

标签: sql scripting duplicates performance

快速SQL的示例是什么,可以在包含数十万条记录的数据集中获取重复项。我通常使用类似的东西:

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

但这很慢。

5 个答案:

答案 0 :(得分:78)

这是更直接的方式:

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

答案 1 :(得分:16)

你可以尝试:

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

答案 2 :(得分:5)

上周提出了一个类似的问题。那里有一些很好的答案。

SQL to find duplicate entries (within a group)

在那个问题中,OP对表(文件)中的所有列(字段)感兴趣, 但如果行具有相同的键值(afield1),则属于同一组。

答案有三种:

where子句中的子查询,就像这里的其他一些答案一样。

表与作为表格查看的组之间的内部联接(我的回答)

和分析查询(对我来说是新的东西)。

答案 3 :(得分:5)

顺便说一句,如果有人想要删除重复项,我已经使用了这个:

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

答案 4 :(得分:3)

这应该相当快(如果dupeField被索引,则更快)。

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(*),你无法检查重复的次数,只是它出现了不止一次。