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提供思路,這也是一種方法。
