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;
-- 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) 保留每組第一筆。