UPDATE a
SET a.EmployeeStrId = b.PressWorkId
FROM CEmployee a
INNER JOIN CCard b ON a.CardId = b.CardId;
DELETE a
FROM EConsumeData a
INNER JOIN CCard b ON a.CardId = b.CardId;
語法關鍵:DELETE 別名 FROM 表別名 JOIN ...,而非 DELETE FROM 表 JOIN ...。
INSERT INTO 正式表 SELECT * FROM 暫存表找出重複群組的「標識欄位」(如時間戳),保留極值行,刪除其餘。
-- 1. 找出重複群組及保留行 (最大消費日期)
SELECT DeviceId, RecordId, CardId, CardValue, UseCount, ConsumeMoney,
COUNT(CardId) AS Cnt, MAX(ConsumeDate) AS KeepDate
INTO #TmpKeep
FROM EConsumeData
WHERE CONVERT(char(10), ConsumeDate, 21) BETWEEN '2006-01-01' AND '2007-12-31'
GROUP BY DeviceId, RecordId, CardId, CardValue, UseCount, ConsumeMoney
HAVING COUNT(CardId) > 1
ORDER BY CardId, UseCount;
GO
-- 2. 刪除重複行 (保留 KeepDate 那一筆)
DELETE A
FROM EConsumeData A
INNER JOIN #TmpKeep B
ON A.DeviceId = B.DeviceId
AND A.RecordId = B.RecordId
AND A.CardId = B.CardId
AND A.CardValue = B.CardValue
AND A.UseCount = B.UseCount
AND A.ConsumeMoney = B.ConsumeMoney
AND A.ConsumeDate <> B.KeepDate; -- 若改 = 則保留暫存表那筆
GO
DROP TABLE #TmpKeep;
DELETE 別名 FROM ... JOIN ... 可精準刪除主表資料HAVING COUNT(*) > 1 找出重複群組