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
);
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY peopleId ORDER BY rowid) AS rn
FROM people
)
DELETE FROM cte WHERE rn > 1;
此法語法簡潔、效能佳,支援多欄位 PARTITION BY,為現代 SQL Server 首選做法。
rowid 為 SQL Server 內部虛擬欄位,僅限堆疊表;有叢集索引表請改用主鍵或 %%physloc%%。SELECT 確認將保留哪些列。