1、
表:ee(id,name,age)
要求:列出所有名字重复的人的记录
select name from ee group by name having count(*)>=2;
NAME
-------------------------
Zhang3
Wang1
Zhang1
Zhang2
2、
有表:ee(name,age)
name age
Tom 16
Sun 14
Tom 16
Tom 16
要求:过滤掉所有多余的重复记录
建表语句:
create table ee(name varchar2(20),age int);
insert into ee values('Tom',16);
insert into ee values('Sun',14);
insert into ee values('Tom',16);
insert into ee values('Tom',16);
commit;
(1)、
delete from ee
where rowid not in (select max(rowid) from ee group by name);
(2)、
delete from ee
where rowid not in (select rid
from (select name,
age,
row_number() over(partition by name order by name) rn,
rowid rid
from ee)
where rn = 1);
1、先分组取出最大/最小rowid,然后使用反连接进行删除
2、根据分析函数row_number 取出最小编号,然后用反连接进行删除
3、直接使用exists,当删除一张表的rowid比另一张表大时
如果对一个表删除的数据很多或很少,那么这三种方法应该如何取舍?
测试结论:
如果删除表中的大量数据时,由于delete会产生大量的 redo 和 undo,因此效率是很慢的,此时可以使用CATS重建一下表。
如果删除的数据量比较小,这时候可以使用方法1和方法2进行删除,但是需要建索引。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31402276/viewspace-2126877/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31402276/viewspace-2126877/