熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle中如何刪除重復數據

2013-11-13 15:53:58  來源: Oracle 

  我們可能會出現這種情況某個表原來設計不周全導致表裡面的數據數據重復那麼如何對重復的數據進行刪除呢?

  重復的數據可能有這樣兩種情況第一種時表中只有某些字段一樣第二種是兩行記錄完全一樣

  一對於部分字段重復數據的刪除

  先來談談如何查詢重復的數據吧

  下面語句可以查詢出那些數據是重復的

  select 字段字段count(*) from 表名 group by 字段字段 having count(*) >

  將上面的>號改為=號就可以查詢出沒有重復的數據了

  想要刪除這些重復的數據可以使用下面語句進行刪除

  delete from 表名 a where 字段字段 in

  (select 字段字段count(*) from 表名 group by 字段字段 having count(*) > )

  上面的語句非常簡單就是將查詢到的數據刪除掉不過這種刪除執行的效率非常低對於大數據量來說可能會將數據庫吊死所以我建議先將查詢到的重復的數據插入到一個臨時表中然後對進行刪除這樣執行刪除的時候就不用再進行一次查詢了如下

  CREATE TABLE 臨時表 AS

  (select 字段字段count(*) from 表名 group by 字段字段 having count(*) > )

  上面這句話就是建立了臨時表並將查詢到的數據插入其中

  下面就可以進行這樣的刪除操作了

  delete from 表名 a where 字段字段 in (select 字段字段 from 臨時表);

  這種先建臨時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多

  這個時候大家可能會跳出來說什麼?你叫我們執行這種語句那不是把所有重復的全都刪除嗎?而我們想保留重復數據中最新的一條記錄啊!大家不要急下面我就講一下如何進行這種操作

  在oracle中有個隱藏了自動rowid裡面給每條記錄一個唯一的rowid我們如果想保留最新的一條記錄

  我們就可以利用這個字段保留重復數據中rowid最大的一條記錄就可以了

  下面是查詢重復數據的一個例子

  select arowida* from 表名 a

  where arowid !=

  (

  select max(browid) from 表名 b

  where a字段 = b字段 and

  a字段 = b字段

  )

  下面我就來講解一下上面括號中的語句是查詢出重復數據中rowid最大的一條記錄

  而外面就是查詢出除了rowid最大之外的其他重復的數據了

  由此我們要刪除重復數據只保留最新的一條數據就可以這樣寫了

  delete from 表名 a

  where arowid !=

  (

  select max(browid) from 表名 b

  where a字段 = b字段 and

  a字段 = b字段

  )

  隨便說一下上面語句的執行效率是很低的可以考慮建立臨時表講需要判斷重復的字段rowid插入臨時表中然後刪除的時候在進行比較

  create table 臨時表 as

  select a字段a字段MAX(aROWID) dataid from 正式表 a GROUP BY a字段a字段;

  delete from 表名 a

  where arowid !=

  (

  select bdataid from 臨時表 b

  where a字段 = b字段 and

  a字段 = b字段

  );

  commit;

  二對於完全重復記錄的刪除

  對於表中兩行記錄完全一樣的情況可以用下面語句獲取到去掉重復數據後的記錄

  select distinct * from 表名

  可以將查詢的記錄放到臨時表中然後再將原來的表記錄刪除最後將臨時表的數據導回原來的表中如下

  CREATE TABLE 臨時表 AS (select distinct * from 表名);

  drop table 正式表;

  insert into 正式表 (select * from 臨時表);

  drop table 臨時表;

  如果想刪除一個表的重復數據可以先建一個臨時表將去掉重復數據後的數據導入到臨時表然後在從

  臨時表將數據導入正式表中如下

  INSERT INTO t_table_bak

  select distinct * from t_table;


From:http://tw.wingwit.com/Article/program/Oracle/201311/17477.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.