(面試題)如何查找Oracle數據庫中的重復記錄


今天做了個面試題:查找Oracle數據庫中的重復記錄,下面詳細介紹其他方法(參考其他資料)

本文介紹了幾種快速查找ORACLE數據庫中的重復記錄的方法。

下面以表table_name為例,介紹三種不同的方法來確定庫表中重復的記錄

方法1:利用分組函數查找表中的重復行:按照某個字段分組,找出行數大於1的列,即由重復記錄

利用select 語句中的分組函數GROUP BY/HAVING可以很容易確定重復的行。假設需要創建惟一索引的列為column,

對column用group by分組統計並返回每組的個數,如果組中記錄數超過1個就存在重復的行。命令如下:
SQL>Select column from table_name
Group by column
Having count(column)>1;
這種查詢方式簡便、快捷,是ORACLE數據庫中最常用的一種方法

方法2:利用偽列自關聯查詢

在ORACLE數據庫的內部,每一表都有一rowid偽列,行標識惟一標識行,提供對特殊行的快速存取。對該列使用最大(max)或者最小(min)函數可以非常容易地確定重復的行。
1)利用max函數查找重復行
SQL>
select column1, column2, column3 from table_name a 
          where  rowid< (select max(rowid) from table_name 
              where column1=a.column1 and column2=a.column2 
              and colum3=a.colum3 and ...);

2).利用min函數查找重復行
SQL>select column1,column2,column3 from table_name a 
              where rowid> (select min(rowid) from table_name 
              where column1=a.column1 and column2=a.column2 
              and colum3=a.colum3 and ...);
不過,當表比較大(例如50萬條以上)時,這個方法的效率之差令人無法忍受。

方法3:通過定義完整性約束查找重復行

 

 定義一個完整性約束,integrity constraint是一個限制基表中一列或多列值的規則。可通過對表定義UNIQUE約束,指定惟一關鍵字。為了滿足此約束,在惟一關鍵字列中不能包含相同的值。因此可用EXCEPTIONS INTO子句,將違背激活的完整性約束的記錄存儲在一個表(EXCEPTIONS)中,此表必須在使用此選項之前先建好。將EXCEPTIONS表和table_name表通過rowid關聯起來即可得到表table_name中重復的記錄。 具體方法如下:
     1)創建表EXCEPTIONS,用來存放重復記錄的信息。
         SQL>create table exceptions(row_id rowid,
                                   owner varchar2(30),
                                   table_name varchar2(30),
                                   constraint varchar2(30));
2)為表table_name定義惟一(UNIQUE)約束,如果在定義的關鍵字中包含相同的值,系統將提示ORA-02299: 不能創建 - 有重復的值,並將重復記錄的信息存入EXCEPTIONS表中。
SQL>alter table table_name
                add constraint unq_column
                unique(column1,column2,……)
              exceptions into EXCEPTIONS;
2. 將表table_name與EXCEPTIONS通過偽列(rowid)建立關聯,偽列相等的記錄就是table_name中的重復記錄。
SQL>select column1,column2,…… 
from table_name a ,EXCEPTIONS b
              where a.rowid=b.row_id ;

這種方式查詢效率較高,而且可以較完全的記錄下重復記錄的信息,但是步驟較繁瑣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM