在Oracle数据库中有一表t_foo,表中有一字段id,如何高效地删除表中id字段的重复数据 ?
解答:
因为Oracle提供了两个伪例,一个是rownum,另一个是rowid,他们的应用分别是分页查询和性能调优上。
这里需要使用到rowid,因为它是oracle数据库自动为记录添加唯一的18位编号,不会随着查询而改变。
--思路:
--先查看rowid
select t.id,rownum,rowid from t_foo t
2 1 AAAM4RAAEAAAAI0AAA
1 2 AAAM4RAAEAAAAI1AAA
3 3 AAAM4RAAEAAAAI1AAB
4 4 AAAM4RAAEAAAAI1AAC
5 5 AAAM4RAAEAAAAI1AAE
5 6 AAAM4RAAEAAAAI3AAA
5 7 AAAM4RAAEAAAAI3AAB
4 8 AAAM4RAAEAAAAI3AAC
--根据重复字段分组,找出最大的rowid值
select t.id,max(rownum),max(rowid) from t_foo t group by t.id;
1 2 AAAM4RAAEAAAAI1AAA
2 1 AAAM4RAAEAAAAI0AAA
4 8 AAAM4RAAEAAAAI3AAC
5 7 AAAM4RAAEAAAAI3AAB
3 3 AAAM4RAAEAAAAI1AAB
--使用子查询关联查询,找出比max(rowid)小的重复值
select b.id,rownum,rowid from t_foo b where rowid< (select max(rowid) from t_foo where id=b.id);
4 1 AAAM4RAAEAAAAI1AAC
5 2 AAAM4RAAEAAAAI1AAE
5 3