提示:文中「重複」指特定欄位值重複,非整列完全相同。
使用子查詢搭配 GROUP BY 與 HAVING COUNT(*) > 1 找出重複值:
SELECT *
FROM 表
WHERE 重複欄位 IN (
SELECT 重複欄位
FROM 表
GROUP BY 重複欄位
HAVING COUNT(*) > 1
);
常見做法是利用 ROW_NUMBER() 分組排序後刪除序號大於 1 的列(SQL Server 2005+):
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY 重複欄位 ORDER BY (SELECT 0)) AS rn
FROM 表
)
DELETE FROM CTE WHERE rn > 1;
DELETE t1
FROM 表 t1
INNER JOIN 表 t2
ON t1.重複欄位 = t2.重複欄位
AND t1.ID > t2.ID; -- 假設有主鍵 ID
CREATE UNIQUE INDEX UX_表_重複欄位 ON 表(重複欄位)
WITH (IGNORE_DUP_KEY = ON); -- 插入重複值時只發出警告不報錯