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

在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 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值