oracle,Mysql 查詢,刪除重複資料
阿新 • • 發佈:2020-09-01
Oracle
1.查詢某欄位重複資料
select
欄位1,欄位2,
count
(*)
from
表名
group
by
欄位1,欄位2
having
count
(*) > 1
2.刪除某欄位重複資料
刪除所有
delete
from
表名 a
where
欄位1,欄位2
in
(
select
欄位1,欄位2,
count
(*)
from
表名
group
by
欄位1,欄位2
having
count
(*) > 1)
上面的SQL注意:語句非常簡單,就是將查詢到的資料刪除掉。不過這種刪除執行的效率非常低,對於大資料量來說,可能會將資料庫吊死。
建議先將查詢到的重複的資料插入到一個臨時表中,然後對進行刪除,這樣,執行刪除的時候就不用再進行一次查詢了。如下:
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
臨時表);
留下一條記錄
oracle中,有個隱藏了自動rowid,裡面給每條記錄一個唯一的rowid,我們如果想保留最新的一條記錄,我們就可以利用這個欄位,保留重複資料中rowid最大的一條記錄就可以了。
使用ROWID查詢重複資料:
select
a.rowid,a.*
from
表名 a
where
a.rowid !=
(
select
max
(b.rowid)
from
表名 b
where
a.欄位1 = b.欄位1
and
a.欄位2 = b.欄位2 )
括號中的SQL查詢出rowid最大的記錄,而外面就是查詢出除了rowid最大之外的其他重複的資料了。由此,我們要刪除重複資料,只保留最新的一條資料,就可以這樣寫了:
刪除重複資料(留下最大ROWID的一條)
delete
from
表名 a
where
a.rowid !=
(
select
max
(b.rowid)
from
表名 b
where
a.欄位1 = b.欄位1
and
a.欄位2 = b.欄位2 )
delete
tab t
where
t.rowid > (
select
min
(t2.rowid)
from
tab t2
where
t.col2 = t2.col2
and
t.col8 = t2.col8
)
當然,上面語句的執行效率是很低的,可以考慮建立臨時表,講需要判斷重複的欄位、rowid插入臨時表中,然後刪除的時候在進行比較。
create
table
臨時表
as
select
a.欄位1,a.欄位2,
MAX
(a.ROWID) dataid
from
正式表 a
GROUP
BY
a.欄位1,a.欄位2;
delete
from
表名 a
where
a.rowid !=
(
select
b.dataid
from
臨時表 b
where
a.欄位1 = b.欄位1
and
a.欄位2 = b.欄位2 );
commit
;
對於完全重複記錄的刪除
對於表中兩行記錄完全一樣的情況,可以用下面語句獲取到去掉重複資料後的記錄: