典型sql面试点-rowid删除数据

来源:互联网 发布:淘宝客开通 编辑:程序博客网 时间:2024/06/05 15:29

在Oracle数据库中有一表t_foo,表中有一字段id,如何高效地删除表中id字段的重复数据 ?

解答:

因为Oracle提供了两个伪例,一个是rownum,另一个是rowid,他们的应用分别是分页查询和性能调优上。

这里需要使用到rowid,因为它是oracle数据库自动为记录添加唯一的18位编号,不会随着查询而改变。


--思路: --先查看rowidselect t.id,rownum,rowid from t_foo t21AAAM4RAAEAAAAI0AAA12AAAM4RAAEAAAAI1AAA33AAAM4RAAEAAAAI1AAB44AAAM4RAAEAAAAI1AAC55AAAM4RAAEAAAAI1AAE56AAAM4RAAEAAAAI3AAA57AAAM4RAAEAAAAI3AAB48AAAM4RAAEAAAAI3AAC--根据重复字段分组,找出最大的rowid值select t.id,max(rownum),max(rowid) from t_foo t group by t.id; 12AAAM4RAAEAAAAI1AAA21AAAM4RAAEAAAAI0AAA 48AAAM4RAAEAAAAI3AAC57AAAM4RAAEAAAAI3AAB 33AAAM4RAAEAAAAI1AAB  --使用子查询关联查询,找出比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    AAAM4RAAEAAAAI3AAA--直接删除那些重复的值,若数据量较大,建议通过临时表来进行数据操作,也就是先保存不重复数据,再drop/create table,然后insert intodelete from t_foo b where rowid< (select max(rowid) from t_foo where id=b.id);


备注:关于索引,只对查询有用,对insert into,delete,update 的操作反而有影响

原创粉丝点击