经典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;
分析:
这里使用的rowid是oracle数据表中的伪列,rowid会自动增长,不同行记录的rowid绝不会重复。比如第一行的rowid是AAAizrAAEAAAAllAAA,则第二行的rowid为AAAizrAAEAAAAllAAB,第三行的rowid为AAAizrAAEAAAAllAAC。具体可用select rowid from emp来查询。
select min(b.rowid) from emp b where a.id = b.id and a.name = b.name这一句是把id和name都相同的记录分组(本例子可以分成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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29485627/viewspace-1852697/