首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 快速刪除重複資料三大招:DISTINCT 建臨時表、ROWID 保留法、GROUP BY MAX(ROWID) 高效能寫法

     編輯:Oracle 資料庫基礎

方法一:DISTINCT + 臨時表(最直觀、鎖表時間最長)

CREATE TABLE temp_emp AS SELECT DISTINCT * FROM employee;
TRUNCATE TABLE employee;
INSERT INTO employee SELECT * FROM temp_emp;

方法二:ROWID 子查詢刪除(保留 MAX/MIN ROWID)

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
);

方法三:GROUP BY MAX(ROWID) 單次掃描(效能最佳)

DELETE FROM employee
WHERE ROWID NOT IN (
    SELECT MAX(ROWID)
    FROM employee
    GROUP BY emp_id, emp_name, salary
);

原理說明

  • Oracle 每列擁有唯一 ROWID,編碼資料檔案號、區塊號、列號。
  • 重複列的所有業務欄位相同,但 ROWID 必異,故可用 MAX/MIN(ROWID) 當作保留鍵。
  • 方法三僅需一次 Full Table Scan + Hash Group By,避免相關子查詢的 Nested Loops,大量資料時效能顯著優於方法二。

測試資料

EMP_ID EMP_NAME SALARY
1      sunshine 10000
3      xyz      30000
2      semon    20000
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved