逐列比對刪除,百萬筆資料需執行數小時,且易發生鎖衝突。
CREATE TABLE Products_temp (
ProductID INT,
ProductName NVARCHAR(40),
Unit CHAR(2),
UnitPrice MONEY
)
企業管理器 → 管理索引 → 新增 → 勾選「唯一」與「忽略重複鍵」。或 T-SQL:
CREATE UNIQUE INDEX UX_Products_temp_Key
ON Products_temp (ProductName, Unit, UnitPrice)
WITH (IGNORE_DUP_KEY = ON)
關鍵:索引欄位決定何謂「重複」,務必包含業務主鍵組合。
INSERT INTO Products_temp SELECT * FROM Products
訊息:「已忽略重複的鍵。」臨時表現無重複列。
DELETE FROM Products;
INSERT INTO Products SELECT * FROM Products_temp;
DROP TABLE Products_temp
SQL Server 2008+ 可用 MERGE 或 ROW_NUMBER() 窗口函數單陳述式完成:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductName, Unit, UnitPrice ORDER BY ProductID) AS rn
FROM Products
)
DELETE FROM cte WHERE rn > 1