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資料夾。

相關推薦

高效刪除Oracle資料庫重複資料保留最新方法

在對資料庫進行操作過程中我們可能會遇到這種情況,表中的資料可能重複出現,使我們對資料庫的操作過程中帶來很多的不便,那麼怎麼刪除這些重複沒有用的資料呢?  重複資料刪除技術可以提供更大的備份容量,實現更長時間的資料保留,還能實現備份資料的持續驗證,提高資料恢復服務水平,方便實

MySQL刪除重複資料保留

以為通過命令直接刪除就可以了,總是報錯: delete from test where name in(select name from test as t having count(name)>1) 發現在這隻能建立臨時表格,方法1設計可行: 1. 首先先建立一

mysql刪除重複資料保留

因為系統bug在對所在店鋪的會員進行遮蔽的時候沒有進行查重操作,導致在遮蔽表中出現了重複的資料,所以需要刪除此表中姓名重複的資料,並保留其中的一條。模擬資料如下圖: 第一條sql : delete from t_black_list where se

mysql刪除重複記錄保留重複資料資料的SQL語句理解

正好想寫一條刪除重複語句並保留一條資料的SQL,網上查了一部分資料寫的很詳細,但還是在這裡寫下自己的理解,以遍後續學習 。如下: 表字段和資料:  SQL語句:  DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(

MySQL 刪除重複資料保留最小ID值

使用SQL語句,刪除表中重複的項,保留最小的ID; 在表 tabel 1中,存在大量重複資料,需要刪除重複項,且儲存 ID 為最小的那條記錄。 tabel 1表中【jzmdid】資料重複 ID jzmdid aac002 aac003 yj_mo

SQL刪除重複的行(重複資料)保留一行

方法二:使用在ETL中 select distant into,這種方法藉助一個新的table,把不重複的結果集轉移到新table中 SELECT distinct Col1, Col2 INTO NoDups FROM Dup1; select * from NoDups

例項介紹刪除資料庫重複資料的幾個方法

作者: ddvip,  出處:IT專家網論壇, 責任編輯: 陳子琪, 2009-09-24 07:00   例項介紹刪除資料庫中重複資料的兩個方法:   第一個方法:   declare @max integer ,@id integer   declare c

關於mysql刪除重複記錄保留重複資料資料的SQL語句理解

正好想寫一條刪除重複語句並保留一條資料的SQL,網上查了一部分資料寫的很詳細,但還是在這裡寫下自己的理解,以遍後續學習 。如下: 表字段和資料:  SQL語句:  DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(SELE

Java獲取資料庫資料獲取下拉列表資料 獲取省、市、區的資料根據上層去控制下

$(function() { //validateRule(); getDept(); $("select[name='deptNamee']").change(function() { var deptCode = $("select[name='deptN

解決查詢MySQL資料庫重複資料的問題

今天遇到一個問題,需求是查詢新採集資料中 重複資料 的條數。在採集完資料對資料進行去重查詢時sql結果不正確,因為有一部分sql是在業務程式碼中進行拼接的: “SELECT COUNT(*) FROM (“ + sql + “)_AA;” 之前的sql:SELECT 1 FROM TAB

MySQL刪除重複資料保留其中最大id的

今天同事寫了個刪除重複資料保留一條記錄的資料庫語句,問我錯在哪兒,正好給大家講講【注:以下語句只單對MYSQL資料庫】 語句 -- 問題: delete from `show` where id not in  (  select MAX(id)

mybatis 在oracle資料庫插入資料時獲取自增ID sequence序列

在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關係。 Create Sequence 首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE許可權。 建立語句如下: CREATE SEQUEN

Oracle刪除重複資料並且只留其中資料

資料庫操作中,經常會因為導資料造成資料重複,需要進行資料清理,去掉冗餘的資料,只保留正確的資料 一:重複資料根據單個欄位進行判斷 1、首先,查詢表中多餘的資料,由關鍵欄位(name)來查詢。 select * from   table_name  where name in (sel

Oracle--Oracle資料庫插入日期日期帶有時分秒(java.util.Date型別)

       通過JDBC向oracle資料庫中插入時間型別時間時,可以直接向資料庫中插入java.sql.Date型別的時間,但是時間只包含年月日,沒有時分秒。如果需要通過JDBC向oracle中插入java.util.Date型別的時間,先將Date轉換成格式化字串,再進

JDBC對插入,刪除,修改資料庫資料

    public static void add()     {         String sql = "insert into users values(?,?,?,?,?,?)";         try         {             preparedStatement = conn

oracle資料庫資料 findone返回的為null

最近通過SQL developer工具新增一個數據進入資料庫中之後,程式碼中的findone 返回的為null空值,但是通過相同的方法找其他的值卻能找到。 中間通過 repository 中的findAll()方法把資料庫中的資料都打出來,發現壓根沒有新增進去的新資料。最

shell指令碼實現刪除過期資料庫資料

一個應用系統每天都需不間斷的向資料庫中插入資料,而對於很早之前的資料一般都需要從資料庫中清理,防止資料量無限增大,耗費儲存和影響資料查詢效率。 通過兩個檔案實現,一個檔案為配置檔案,一個為指令碼檔案。 本示例為刪除資料庫中180天(時間可在配置檔案中修改)前的資料。

資料庫取出資料存放到陣列然後對資料進行分類顯示

<table width="280" id="zhangdan_wenzi" > <?php //food_typ id 將id存到陣列中 $sqlfood = "SELECT food_type.id FROM food_type ";

mybatis 在oracle資料庫插入資料時獲取自增ID

就是建立一個SEQUENCE,通過它來獲取自增ID ① 在資料庫中操作: CREATE SEQUENCE CONFIG_KEYWORD_GATHER_SEQ;在XXXMapper.xml中程式碼:&l

mybatis 在oracle資料庫插入資料時獲取自增ID sequence序列

在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關係。 Create Sequence 首先要有CREATE SEQUENCE或者CREATE