針對無主鍵/唯一索引的測試表出現重複資料,整理四種刪除重複記錄的實用 SQL 寫法,並展示查詢重複資料的技巧。
EMP_ID NUMBER(10)
EMP_NAME VARCHAR2(20)
SALARY NUMBER(10,2)
資料含三組重複:(1, sunshine, 10000)×2、(2, semon, 20000)×3、(3, xyz, 30000)×1。
-- 去重顯示
SELECT DISTINCT * FROM employee;
-- 找出重複群組
SELECT * FROM employee GROUP BY emp_id, emp_name, salary HAVING COUNT(*) > 1;
-- 利用 ROWID 保留每組最大 ROWID
SELECT * FROM employee e1
WHERE rowid IN (SELECT MAX(rowid) FROM employee e2
WHERE e1.emp_id=e2.emp_id AND e1.emp_name=e2.emp_name AND e1.salary=e2.salary);
CREATE TABLE temp_emp AS SELECT DISTINCT * FROM employee;
TRUNCATE TABLE employee;
INSERT INTO employee SELECT * FROM temp_emp;
DROP TABLE temp_emp;
DELETE FROM employee e2
WHERE rowid NOT IN (SELECT MAX(e1.rowid) FROM employee e1
WHERE e1.emp_id=e2.emp_id AND e1.emp_name=e2.emp_name AND e1.salary=e2.salary);
DELETE FROM employee e2
WHERE rowid < (SELECT MAX(e1.rowid) FROM employee e1
WHERE e1.emp_id=e2.emp_id AND e1.emp_name=e2.emp_name AND e1.salary=e2.salary);
DELETE FROM employee
WHERE rowid NOT IN (
SELECT MAX(t1.rowid) FROM employee t1
GROUP BY t1.emp_id, t1.emp_name, t1.salary
);
ALTER IGNORE TABLE ... ADD UNIQUE INDEX(舊版支援)。