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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM