SQL删除指定条件的重复数据,只保留一条

DECLARE @Count INT = 1
WHILE @Count > 0
BEGIN
DELETE TB FROM TableName TB 
WHERE TB.ID IN (SELECT MIN(ID) FROM TableName TB2
GROUP BY TB2.Column1,TB2.Column2,...TB2.ColumnN
HAVING COUNT(1) > 1);
SET @Count = @@ROWCOUNT;
END

这里使用了循环删除,并不是最优的方法,欢迎园友不吝批评指正。 

 


其实还有一种方法是先查询重复的数据,然后在重复数据中保留一条。 下面用例子说明。

例如表City有如下的数据:

查询出重复的数据,Id只保留其中一个

SELECT MIN(Id) Id,Name FROM dbo.City 
GROUP BY Name
HAVING COUNT(1) >  1

然后使用删除时Join上面的表

DELETE C FROM City C 
JOIN (
    SELECT MIN(Id) Id,Name FROM dbo.City
    GROUP BY Name
    HAVING COUNT(1) >  1
) TMP ON C.Name = TMP.Name AND C.Id <> TMP.Id

另外一种方法是园友Adeal2008指出的使用row_number()来处理,感谢Adeal2008提供思路,这也是一种方法。

posted @ 2018-04-06 15:13  Jichan·Jong  阅读(11006)  评论(1编辑  收藏  举报