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

最快的“获取重复项”SQL脚本,sql,scripting,duplicates,performance,Sql,Scripting,Duplicates,Performance,快速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

快速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,则它们属于同一组

答案有三种:

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

表与被视为表的组之间的内部联接我的答案


分析查询对我来说是新的。

顺便说一句,如果有人想删除重复项,我使用了以下方法:

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

如果对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

我想这个查询唯一的缺点是,因为你没有进行计数*你不能检查它重复的次数,只能检查它出现了不止一次。

这实际上是我的首选方法,因为你可以返回表中的所有列。奇怪的是,有两个人投票否决了这个答案,但没有说明原因。我想这意味着它有问题吗?是的,但它显示了OP要求的信息:field1和field2,这可能是确定要保留哪一行所必需的。例如,这比较慢,但它会提供两个重复记录。当我在我的表上尝试时,这并不是很快。我没有索引,只是注意到这只会删除其中一个副本。如果有三行具有相同的值,则必须运行此查询两次以消除所有重复项。