oracle刪除重複數據並至少保留一條(大數據操作)

1. 前言

有時候會遇到這樣的問題,一個表中有重複數據,並且數據量比較大,在一萬條以上。這個時候如果用delete刪除重複數據並保留一條的時候會非常之慢,數據庫直接卡死。

這個時候可以通過創建臨時表來進行重複數據的篩選,然後刪除原來的數據,把臨時的表數據再移到數據庫的表中。自己測試這種方法十幾萬的數據量不到1分鐘就可以完成。

2. 開始

      2.1 創建臨時表

 僞語法:

CREATE TABLE TEMP_DELETE_ORDER_INFO AS

(

查找重複的數據並只顯示一條

union all

查找不重複的數據

)

 SQL 案例:


CREATE TABLE TEMP_DELETE_ORDER_INFO AS (
    --id重複的數據
    select T1.* from ORDER_INFO T1 where T1.id in
	    (select id from ORDER_INFO group by id having count(id) >1) 
        AND T1.ROWID NOT IN 
	    (SELECT MIN(ROWID) FROM ORDER_INFO GROUP BY id HAVING COUNT(*) > 1)

    --將數據連起來
    union all

    --id不重複的數據
    select T2.* from ORDER_INFO T2 where T2.id in
        (select id from ORDER_INFO group by id having count(id) =1)
);

2.2 清空原來的表

truncate TABLE ORDER_INFO;

2.3 將臨時表的數據導入到原來的表中

 

insert into ORDER_INFO  select * from TEMP_DELETE_ORDER_INFO;

2.4 刪除臨時表


DROP TABLE TEMP_DELETE_ORDER_INFO;

3. 結尾

創建臨時表查找重複數據和不重複數據需要根據自己的需求,我這個是根據id重複來查找的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章