需快速去除資料表重複列且不想寫複雜 ROW_NUMBER() 或 CTE?利用 IGNORE_DUP_KEY 索引特性,三行指令搞定。
-- 1. 建立結構相同的暫存表
SELECT * INTO #Table_Copy FROM SourceTable WHERE 1=0;
-- 2. 建立唯一索引並啟用 IGNORE_DUP_KEY
CREATE UNIQUE INDEX IX_RemoveDup ON #Table_Copy (KeyColumn) WITH IGNORE_DUP_KEY;
-- 3. 批次匯入原表資料,重複列自動略過
INSERT INTO #Table_Copy SELECT * FROM SourceTable;
-- 4. 結果在 #Table_Copy,可選取回原表或重建
-- TRUNCATE TABLE SourceTable;
-- INSERT INTO SourceTable SELECT * FROM #Table_Copy;
IGNORE_DUP_KEY 讓唯一索引在大量插入時,遇到重複鍵值僅忽略該列並繼續,不會整批回滾、不會拋錯誤(僅回傳警告訊息)。SET IDENTITY_INSERT ON 或重新設計索引鍵。TABLOCK 提升效能。WITH CTE AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY KeyColumn ORDER BY (SELECT 0)) AS RN
FROM SourceTable
)
DELETE FROM CTE WHERE RN > 1;
CTE 寫法可讀性高、支援複雜去重邏輯(如保留最新/最舊),但中小表用 IGNORE_DUP_KEY 更簡潔快速。
掌握此技巧,臨時去重需求秒級解決,無需撰寫冗長 T-SQL。