資料表出現重複列是常見資料品質問題。依重複定義不同,解法分為「完全重複」與「部分重複」兩類,本文提供標準 T-SQL 寫法。
-- 建立測試資料
CREATE TABLE #tmp (UserID INT, Name VARCHAR(10), Age INT);
INSERT INTO #tmp VALUES
(111,'張三',26),(222,'李四',25),(333,'王五',30),(111,'張三',26);
-- 解法:DISTINCT 去重
SELECT DISTINCT * FROM #tmp;
-- 若需保留至正式表
SELECT DISTINCT * INTO #new FROM #tmp;
DROP TABLE #tmp;
EXEC sp_rename '#new', '#tmp';
-- 測試資料:同一用戶有多筆不同日期記錄
CREATE TABLE #t (UserID INT, Name VARCHAR(10), Age INT, LogDate DATETIME);
INSERT INTO #t VALUES
(111,'張三',26,'2010-02-23'),
(222,'李四',25,'2010-03-13'),
(333,'王五',30,'2011-03-25'),
(111,'張三',26,'2011-07-07');
-- 需求:同 UserID+Name+Age 視為重複,保留「日期最新」那一筆
-- 解法:NOT EXISTS 相關子查詢
SELECT * FROM #t a
WHERE NOT EXISTS (
SELECT 1 FROM #t b
WHERE b.UserID = a.UserID
AND b.Name = a.Name
AND b.Age = a.Age
AND b.LogDate > a.LogDate
);
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY UserID, Name, Age
ORDER BY LogDate DESC
) AS rn
FROM #t
)
DELETE FROM cte WHERE rn > 1;
ROW_NUMBER() 搭配 CTE 刪除,效能較佳。SELECT 驗證結果集正確性。