1. 程式人生 > >oracle 刪除重複記錄 只保留一條

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 臨時表);

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

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

  在oracle中,有個隱藏了自動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 
  )


  下面我就來講解一下,上面括號中的語句是查詢出重複資料中rowid最大的一條記錄。

  而外面就是查詢出除了rowid最大之外的其他重複的資料了。

  由此,我們要刪除重複資料,只保留最新的一條資料,就可以這樣寫了:
  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 
  ); 
  commit;

二、完全刪除重複記錄

  對於表中兩行記錄完全一樣的情況,可以用下面語句獲取到去掉重複資料後的記錄:

  select distinct * from 表名

  可以將查詢的記錄放到臨時表中,然後再將原來的表記錄刪除,最後將臨時表的資料導回原來的表中。如下:

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

  truncate table 正式表; --注:原先由於筆誤寫成了drop table 正式表;,現在已經改正過來

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

  drop table 臨時表;

  如果想刪除一個表的重複資料,可以先建一個臨時表,將去掉重複資料後的資料匯入到臨時表,然後在從

  臨時表將資料匯入正式表中,如下:
  INSERT INTO t_table_bak 
  select distinct * from t_table;

 三、怎樣快速刪除oracle資料庫

  最快的方法就進入登錄檔 在執行..裡輸入regedit.

  依次展開HKEY_LOCAL_MACHINE SOFTWARE

  找到ORACLE節點。刪除。

  然後刪除ORACLE資料檔案,安裝的時候選的路徑。

  最後刪除oracle引導檔案,在系統碟符的Program Files 裡面刪除oracle資料夾。