Oracle 去重複的數據

重複的數據分兩種,一種是表中部分字段的重複,一種是兩行以上的記錄完全一樣。


  • 部分字段的重複:

查詢不重複的數據SQL:
select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) = 1

部分字段重複數據的刪除:

查詢重複的數據SQL

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 臨時表);
這種先建臨時表再進行刪除的操作要比直接用一條語句進行刪除高效得多。

以上是把所有的重複的數據全都刪除,沒有保留重複數據的其中一條記錄。

如何保留重複數據的其中一條記錄?

在oracle中,有個隱藏了字段爲rowid,表中每條記錄都有一個唯一的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
)


要刪除重複數據,只保留最新的一條數據:
delete from 表名 a
where a.rowid !=
(
   select max(b.rowid) from 表名 b
   where a.字段1 = b.字段1 and
   a.字段2 = b.字段2
)

以上即是刪除查詢到重複的數據,保留最新一條記錄,這種刪除執行效率低下,數據量大時,不適合。

考慮建立臨時表,將需要判斷重複的字段,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
);


  • 完全重複記錄的刪除:

對於表中兩行或以上的記錄完全一樣的情況,可以使用以下語句獲取到去掉重複數據後的記錄:

select distinct * from 表名

將查詢的記錄放進臨時表,然後再將原來的表記錄刪除,最後將臨時表的數據導回原來的表中。

CREATE TABLE 臨時表 AS (select distinct * from 表名);
truncate table 正式表;
insert into 正式表 (select * from 臨時表);
drop table 臨時表;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章