最快的“获取重复项”SQL脚本
快速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
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,这可能是确定要保留哪一行所必需的。例如,这比较慢,但它会提供两个重复记录。当我在我的表上尝试时,这并不是很快。我没有索引,只是注意到这只会删除其中一个副本。如果有三行具有相同的值,则必须运行此查询两次以消除所有重复项。