刪除資料庫重復的資料庫
A. Oracle資料庫重復數據刪除的幾種方法
重復的數據可能有這樣兩種情況,第一種時表中只有某些欄位一樣,第二種是兩行記錄完全一樣。Oracle資料庫重復數據刪除技術有如下優勢:更大的備份容量、數據能得到持續驗證、有更高的數據恢復服務水平、方便實現備份數據的容災。
一、刪除部分欄位重復數據先來談談如何查詢重復的數據吧。
下面語句可以查詢出那些數據是重復的:
select
欄位1,欄位2,count(*)
from
表名
group
by
欄位1,欄位2
having
count(*)
>
1
將上面的>號改為=號就可以查詢出沒有重復的數據了。
想要刪除這些重復的數據,可以使用下面語句進行刪除
delete
from
表名
a
where
欄位1,欄位2
in
(select
欄位1,欄位2,count(*)
from
表名
group
by
欄位1,欄位2
having
count(*)
>
1)
上面的語句非常簡單,就是將查詢到的數據刪除掉。不過這種刪除執行的效率非常低,對於大數據量來說,可能會將資料庫弔死。所以我建議先將查詢到的重復的數據插入到一個臨時表中,然後對進行刪除,這樣,執行刪除的時候就不用再進行一次查詢了。如下:
CREATE
TABLE
臨時表
AS
(select
欄位1,欄位2,count(*)
from
表名
group
by
欄位1,欄位2
having
count(*)
>
1)
上面這句話就是建立了臨時表,並將查詢到的數據插入其中。
下面就可以進行這樣的刪除操作了:
delete
from
表名
a
where
欄位1,欄位2
in
(select
欄位1,欄位2
from
臨時表);
這種先建臨時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多。
這個時候,大家可能會跳出來說,什麼?你叫我
B. 刪除資料庫中重復的數據,只保留一條這個sql 怎麼寫
有2個辦法
1.找出一份不重復的表,導入到臨時表,把原先的表數據刪除,在把臨時表的數據導回去,這個適合沒有ID欄位的表,語句:
找出唯一數據,把重復去掉並存入中轉表:select distinct * into table(中轉表名稱) from tb(原表)
刪除原表數據:delete tb
把中轉表數據導入原表:insert into tb select * from table
2.有ID欄位的,把相同數據的最大ID當成唯一的
搜索相同數據的最大ID:select max(id) from tb group by 欄位1,欄位2,...(除ID以外的所有欄位)
把重復數據刪除 delete from tb where id not in(select max(id) from tb group by 欄位1,欄位2,...(除ID以外的所有欄位))