CREATE TABLE tbl (a INT);
INSERT INTO tbl VALUES (1),(2),(2),(3),(3),(3);
SELECT a
FROM tbl
GROUP BY a
HAVING COUNT(*) > 1;
結果:2, 3
DELETE FROM tbl A
WHERE A.ROWID < (SELECT MAX(B.ROWID) FROM tbl B WHERE A.a = B.a);
假設表有主鍵 id:
DELETE FROM tbl
WHERE id NOT IN (
SELECT MAX(id) FROM tbl GROUP BY a
);
或使用 CTE + ROW_NUMBER(SQL Server 2005+):
WITH cte AS (
SELECT id, ROW_NUMBER() OVER (PARTITION BY a ORDER BY id) AS rn
FROM tbl
)
DELETE FROM cte WHERE rn > 1;
DELETE t1 FROM tbl t1
INNER JOIN tbl t2
WHERE t1.id < t2.id AND t1.a = t2.a;
GROUP BY ... HAVING COUNT(*) > 1 確認重複鍵值。ROWID、MAX(PK)、ROW_NUMBER()。BEGIN TRAN ... ROLLBACK)。