SqlServer_刪除重復行只保留一條記錄


 
前提:相同的數據重復往數據庫寫入,導致存在僅主鍵Id不同的重復數據,現在需要去除重復數據,僅保留重復數據中Id最大的一條
 
思路:
1、找出存在重復數據的記錄,並取重復數據中最大的Id值
2、刪除記錄中不包含最大Id值的記錄
 
注意:該SQL會刪除沒有重復數據的記錄
實現:
DELETE FROM [Log_IIS].[dbo].[IISLog_table]
WHERE id not in 
(select MAX(Id) from [IISLog_table] group by [RequestTime]
      ,[LogFilename]
      ,[LogRow]
      ,[date]
      ,[time]
      ,[cIp]
      ,[csUsername]
      ,[sSitename]
      ,[sComputername]
      ,[sIp]
      ,[sPort]
      ,[csMethod]
      ,[csUriStem]
      ,[csUriQuery]
      ,[scStatus]
      ,[scSubstatus]
      ,[scWin32Status]
      ,[scBytes]
      ,[csBytes]
      ,[timeTaken]
      ,[csVersion]
      ,[csHost]
      ,[csUserAgent]
      ,[csCookie]
      ,[csReferer]
      ,[sEvent]
      ,[sProcessType]
      ,[sUserTime]
      ,[sKernelTime]
      ,[sPageFaults]
      ,[sTotalProcs]
      ,[sActiveProcs]
      ,[sStoppedProcs] having count(*) > 1)   



下面代碼通過循環方式刪除重復行,不會影響到沒有重復行的記錄

DECLARE @Count INT 
select @Count=COUNT(UserID) from UserBankCardInfo group by UserID
  having count(*) > 1
PRINT @Count

WHILE(@Count>1)
BEGIN
    DELETE FROM UserBankCardInfo
    WHERE id in 
    (
    select MAX(Id) id from UserBankCardInfo group by UserID
      having count(*) > 1
    )  
    SET @Count=@Count-1
END

 




免責聲明!

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



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