DB2 刪除重複數據的核心思路:識別重複鍵值組 → 定位保留行 (通常取最小 ROWID) → 刪除其餘。本文列舉單字段、多字段五種查詢/刪除模式,代碼可直接生產環境參考執行。
SELECT * FROM people
WHERE peopleId IN (
SELECT peopleId FROM people
GROUP BY peopleId
HAVING COUNT(peopleId) > 1
);
DELETE FROM people
WHERE peopleId IN (
SELECT peopleId FROM people
GROUP BY peopleId
HAVING COUNT(peopleId) > 1
)
AND ROWID NOT IN (
SELECT MIN(ROWID) FROM people
GROUP BY peopleId
HAVING COUNT(peopleId) > 1
);
SELECT * FROM vitae a
WHERE (a.peopleId, a.seq) IN (
SELECT peopleId, seq FROM vitae
GROUP BY peopleId, seq
HAVING COUNT(*) > 1
);
DELETE FROM vitae a
WHERE (a.peopleId, a.seq) IN (
SELECT peopleId, seq FROM vitae
GROUP BY peopleId, seq
HAVING COUNT(*) > 1
)
AND ROWID NOT IN (
SELECT MIN(ROWID) FROM vitae
GROUP BY peopleId, seq
HAVING COUNT(*) > 1
);
SELECT * FROM vitae a
WHERE (a.peopleId, a.seq) IN (
SELECT peopleId, seq FROM vitae
GROUP BY peopleId, seq
HAVING COUNT(*) > 1
)
AND ROWID NOT IN (
SELECT MIN(ROWID) FROM vitae
GROUP BY peopleId, seq
HAVING COUNT(*) > 1
);
(col1, col2) IN (SELECT col1, col2 ...) 精確匹配組合鍵CREATE TEMP TABLE dup_keys AS SELECT key_cols, MIN(ROWID) AS keep_rid FROM big_table GROUP BY key_cols HAVING COUNT(*) > 1DELETE FROM big_table b WHERE EXISTS (SELECT 1 FROM dup_keys d WHERE b.key_cols = d.key_cols AND b.ROWID != d.keep_rid)COMMITCOUNT 分批提交避免日誌爆滿REORG TABLE big_table 回收空間 (DMS 表空間)MERGE INTO people p
USING (
SELECT peopleId, MIN(ROWID) AS keep_rid
FROM people
GROUP BY peopleId
HAVING COUNT(*) > 1
) d ON p.peopleId = d.peopleId AND p.ROWID != d.keep_rid
WHEN MATCHED THEN DELETE;
語義更清晰,優化器可生成更優計劃。