經典SQL面試題4:高效的刪除重複記錄方法

zhenghaishu發表於2015-12-03


經典SQL面試題4:高效的刪除重複記錄



需求:刪除表中的重複記錄,無需考慮排列順序


1 建立表

create table emp(id number(5), name varchar2(10));


2 插入資料

insert into emp(id, name) values(1,'劉大');

insert into emp(id, name) values(2,'陳二');

insert into emp(id, name) values(3,'張三');

insert into emp(id, name) values(1,'劉大');

insert into emp(id, name) values(1,'劉大');

insert into emp(id, name) values(4,'李四');

insert into emp(id, name) values(5,'王五');

insert into emp(id, name) values(6,'趙六');

insert into emp(id, name) values(4,'李四');

commit;


3 刪除語句

delete  from  emp a  where  a.rowid > (select min(b.rowid) from  emp b  where  a.id = b.id and a.name = b.name);

commit;


分析:

這裡使用的rowidoracle資料表中的偽列,rowid會自動增長,不同行記錄的rowid絕不會重複。比如第一行的rowidAAAizrAAEAAAAllAAA,則第二行的rowidAAAizrAAEAAAAllAAB,第三行的rowidAAAizrAAEAAAAllAAC。具體可用select rowid from emp來查詢。

select min(b.rowid) from  emp b  where  a.id = b.id and a.name = b.name這一句是把idname都相同的記錄分組(本例子可以分成6組),並取rowid最小的值。在此基礎上delete語句用來刪除每組中的rowid不是最小的記錄。

這裡“>”改為“!=”效果也一樣。


4 檢驗

select * from emp;

    ID NAME

---------- ----------

     1 劉大

     2 陳二

     3 張三

     4 李四

     5 王五

     6 趙六


6 rows selected.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29485627/viewspace-1852697/,如需轉載,請註明出處,否則將追究法律責任。

相關文章