SELECT * FROM XUTEST X
WHERE ROWID != (
SELECT MAX(ROWID) FROM XUTEST Y
WHERE Y.SUPID = X.SUPID
)
假設表 XUTEST 數據:
| ROWID | SUPID | 其他列 |
|---|---|---|
| r1 | 1 | ... |
| r2 | 2 | ... |
| r3 | 2 | ... |
| r4 | 2 | ... |
| r5 | 3 | ... |
對外層每行 X,子查詢計算:MAX(ROWID) WHERE SUPID = X.SUPID
MAX(r1) = r1 → ROWID != r1 為假 → 保留MAX(r2,r3,r4) = r4 → ROWID != r4 為真 → 輸出 r2r4 → ROWID != r4 為真 → 輸出 r3r4 → ROWID != r4 為假 → 保留r5 → ROWID != r5 為假 → 保留輸出 r2, r3 —— 即 SUPID=2 組中除最大 ROWID 外的所有行。
效果:按 SUPID 分組,保留 ROWID 最大(最新)的一行,刪除其餘重複行。
DELETE FROM XUTEST
WHERE ROWID NOT IN (
SELECT MAX(ROWID) FROM XUTEST GROUP BY SUPID
);
-- 或使用 ROW_NUMBER()
DELETE FROM XUTEST
WHERE ROWID IN (
SELECT ROWID FROM (
SELECT ROWID, ROW_NUMBER() OVER (PARTITION BY SUPID ORDER BY ROWID DESC) rn
FROM XUTEST
) WHERE rn > 1
);
ROWID 大小反映插入順序(近似),MAX(ROWID) 通常對應最新插入行。ROW_NUMBER(),性能更優、語義更清晰。