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

刪除資料庫重複資料的三種實用方法

     編輯:關於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;          -- 保留 1 筆
    SET ROWCOUNT @max;
    DELETE FROM 表名 WHERE 主鍵欄位 = @id;
    FETCH cur INTO @id, @max;
END
CLOSE cur;
DEALLOCATE cur;
SET ROWCOUNT 0;

方法二:DISTINCT 複製法(完全重複列)

-- 1. 查看去重結果
SELECT DISTINCT * FROM tableName;

-- 2. 實際刪除重複(保留 1 筆)
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);
-- 最後可再 INSERT 回目標表或重建表

利用 IDENTITY 產生流水號,配合 MIN(autoID) 保留每組第一筆。

建議

  • 資料量小(< 10 萬筆)可用方法二最簡單。
  • 資料量大且有明確主鍵,方法一效能尚可。
  • 需依業務鍵去重複且保留首筆,方法三最靈活。
  • 事後務必加上唯一約束/索引防止再發生。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved