首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 刪除重複數據的三種經典方案

     編輯:關於SqlServer

因程序缺陷導致重複數據是常見問題,不僅佔用空間還可能破壞約束。針對不同重複類型,提供三種成熟解法:

方案一:遊標循環刪除(保留一條)

DECLARE @max INT, @id INT
DECLARE cur CURSOR LOCAL FOR
  SELECT 主鍵, COUNT(*) FROM 表名 GROUP BY 主鍵 HAVING COUNT(*) > 1
OPEN cur
FETCH cur INTO @id, @max
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @max = @max - 1
  SET ROWCOUNT @max
  DELETE FROM 表名 WHERE 主鍵 = @id
  FETCH cur INTO @id, @max
END
CLOSE cur
SET ROWCOUNT 0

適用於有明確主鍵、需逐組處理的場景。

方案二:完全重複記錄去重

-- 查詢去重結果
SELECT DISTINCT * FROM tableName

-- 物理刪除重複(保留一條)
SELECT DISTINCT * INTO #Tmp FROM tableName
DROP TABLE tableName
SELECT * INTO tableName FROM #Tmp
DROP TABLE #Tmp

根因通常是缺乏唯一索引,補建唯一索引可一勞永逸。

方案三:關鍵字段重複去重(保留首條)

-- 假設 Name、Address 為業務鍵
SELECT IDENTITY(INT,1,1) AS autoID, * INTO #Tmp FROM tableName
SELECT MIN(autoID) AS autoID INTO #Tmp2 FROM #Tmp GROUP BY Name, Address
SELECT * FROM #Tmp WHERE autoID IN (SELECT autoID FROM #Tmp2)

利用臨時身份列標記行序,保留每組業務鍵的首條記錄。最終 SELECT 可顯式列出業務列剔除 autoID。

最佳實踐建議

  • 事前預防:設計階段即建立業務鍵唯一約束/索引
  • 事中監控:定期跑重複檢查腳本預警
  • 事後清理:按業務語義選擇保留策略(首條/末條/最新/最全)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved