表 @InvoiceListMaster 中,CompanyName + InvoiceNumber + CustomerNumber 三欄位完全相同視為重複資料,需保留第一筆刪除其餘。
DECLARE @InvoiceListMaster TABLE (
ID INT IDENTITY PRIMARY KEY,
CompanyName NCHAR(20),
InvoiceNumber INT,
CustomerNumber INT,
RmaNumber INT
);
INSERT @InvoiceListMaster VALUES
(N'華為', 1001, 100, 200), -- 重複組 1
(N'華為', 1001, 100, 300), -- 重複組 1
(N'華為', 1001, 100, 301), -- 重複組 1
(N'中興', 1002, 200, 1), -- 重複組 2
(N'中興', 1002, 200, 2); -- 重複組 2
DELETE A
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY CompanyName, InvoiceNumber, CustomerNumber
ORDER BY CompanyName, InvoiceNumber, CustomerNumber) AS rown,
CompanyName, InvoiceNumber, CustomerNumber
FROM @InvoiceListMaster
) A
WHERE EXISTS (
SELECT 1 FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY CompanyName, InvoiceNumber, CustomerNumber
ORDER BY CompanyName, InvoiceNumber, CustomerNumber) AS rown,
CompanyName, InvoiceNumber, CustomerNumber
FROM @InvoiceListMaster
) B
WHERE B.CompanyName = A.CompanyName
AND B.InvoiceNumber = A.InvoiceNumber
AND B.CustomerNumber = A.CustomerNumber
AND A.rown > B.rown -- 保留 rown=1,刪除 rown>1
);
ID ASC 保留最早建立、RmaNumber DESC 保留最新等
;WITH cte AS (
SELECT ID,
ROW_NUMBER() OVER(PARTITION BY CompanyName, InvoiceNumber, CustomerNumber ORDER BY ID) AS rn
FROM @InvoiceListMaster
)
DELETE FROM @InvoiceListMaster
WHERE ID IN (SELECT ID FROM cte WHERE rn > 1);
優勢:可讀性高、避免重複計算 ROW_NUMBER()、標準 SQL 寫法。
SELECT * FROM @InvoiceListMaster;
-- 僅保留:
-- 1, 華為, 1001, 100, 200
-- 4, 中興, 1002, 200, 1
GROUP BY + 聚合函數 + MERGE 或 刪除重插