今天做了個面試題:查找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 ;
這種方式查詢效率較高,而且可以較完全的記錄下重復記錄的信息,但是步驟較繁瑣。