數據庫中重複記錄會影響統計準確性與業務邏輯。本文提供基於 GROUP BY ... HAVING COUNT(*) > 1 模式的 4 類通用 SQL,涵蓋單字段/多字段的查詢與刪除(保留最小 ID)。
重複判定標準:按指定字段分組,COUNT(*) > 1 即為重複組。刪除策略:保留每組 MIN(id),刪除其餘。
SELECT * FROM user
WHERE name IN (
SELECT name FROM user
GROUP BY name
HAVING COUNT(name) > 1
);
DELETE FROM user
WHERE name IN (
SELECT name FROM user
GROUP BY name
HAVING COUNT(name) > 1
)
AND id NOT IN (
SELECT MIN(id) FROM user
GROUP BY name
HAVING COUNT(name) > 1
);
SELECT * FROM user u
WHERE (u.name, u.age) IN (
SELECT name, age FROM user
GROUP BY name, age
HAVING COUNT(*) > 1
);
DELETE FROM user u
WHERE (u.name, u.age) IN (
SELECT name, age FROM user
GROUP BY name, age
HAVING COUNT(*) > 1
)
AND id NOT IN (
SELECT MIN(id) FROM user
GROUP BY name, age
HAVING COUNT(*) > 1
);
ROW_NUMBER() OVER (PARTITION BY ... ORDER BY id) 窗口函數,單掃描完成標記與刪除UNIQUE INDEX,從源頭杜絕重複-- 驗證刪除後無重複
SELECT name, age, COUNT(*)
FROM user
GROUP BY name, age
HAVING COUNT(*) > 1;
-- 應返回空集合
這 4 條 SQL 覆蓋 90% 以上的去重場景,建議收藏備用。生產環境執行刪除前,務必先備份或在從庫驗證。