如何删除重复的行?

从一个相当大的SQL Server表中删除重复的行(即30万行以上)的最佳方法是什么?

当然,由于RowID身份字段的存在,这些行不会是完全重复的。

MyTable

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
解决办法

假设没有空值,你可以GROUP BY唯一列,然后SELECT``MIN (或MAX)RowId作为要保留的行。然后,只要删除所有没有行ID的内容。

DELETE FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL

如果你有一个GUID而不是一个整数,你可以替换为

MIN(RowId)

替换为

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))
评论(30)

在微软支持网站上有一篇关于删除重复数据的好文章。这篇文章相当保守--他们让你在不同的步骤中做所有的事情--但它对大型表格应该很有效。

我过去曾用自连接来做这件事,尽管它可能会用一个HAVING子句来修饰。

DELETE dupes
FROM MyTable dupes, MyTable fullTable
WHERE dupes.dupField = fullTable.dupField 
AND dupes.secondDupField = fullTable.secondDupField 
AND dupes.uniqueField > fullTable.uniqueField
评论(0)

这里是另一篇关于删除重复内容的好文章。

它讨论了为什么它很难:"*SQL是基于关系代数的,而在关系代数中不能出现重复,因为在一个集合中不允许出现重复。

临时表的解决方案,以及两个mysql的例子。

将来你是要在数据库层面上防止,还是从应用角度上防止。 我建议在数据库层面,因为你的数据库应该负责维护参考完整性,开发人员只是会造成问题;)

评论(1)