表 employee 中 emp_name 重複,需保留每組 emp_id 最小的一條,刪除其餘重複行。
-- 1. 查詢有重複的名稱
SELECT emp_name FROM employee GROUP BY emp_name HAVING COUNT(*) > 1;
-- 2. 定位可刪除行(排除每組最小 emp_id)
SELECT t1.* FROM employee t1
WHERE t1.emp_name IN (
SELECT emp_name FROM employee GROUP BY emp_name HAVING COUNT(*) > 1
)
AND t1.emp_id NOT IN (
SELECT MIN(emp_id) FROM employee GROUP BY emp_name HAVING COUNT(*) > 1
);
-- 3. 執行刪除
DELETE t1 FROM employee t1
WHERE t1.emp_name IN (
SELECT emp_name FROM employee GROUP BY emp_name HAVING COUNT(*) > 1
)
AND t1.emp_id NOT IN (
SELECT MIN(emp_id) FROM employee GROUP BY emp_name HAVING COUNT(*) > 1
);
若按 (dept_id, emp_name) 組合去重:
DELETE t1 FROM employee t1
WHERE (t1.dept_id, t1.emp_name) IN (
SELECT dept_id, emp_name FROM employee
GROUP BY dept_id, emp_name HAVING COUNT(*) > 1
)
AND t1.emp_id NOT IN (
SELECT MIN(emp_id) FROM employee
GROUP BY dept_id, emp_name HAVING COUNT(*) > 1
);
CREATE TEMPORARY TABLE tmp_ids SELECT MIN(id) id FROM t GROUP BY cols HAVING COUNT(*)>1;DELETE t FROM t LEFT JOIN tmp_ids ON t.id=tmp_ids.id WHERE tmp_ids.id IS NULL;(利用 JOIN 避免子查詢性能問題)。LIMIT 1000 循環),避免長事務鎖表。