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有如下的数据:

SQL删除指定条件的重复数据,只保留一条_第1张图片

查询出重复的数据,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提供思路,这也是一种方法。

你可能感兴趣的:(SQL删除指定条件的重复数据,只保留一条)