Oracle rownum的疑问

11 篇文章 0 订阅

这周三周四 oracle考试 .早上看了下考试答案,有一地不明:

取出SC表中最高分的学生学号和课程号(5分)

答案: Select no ,cno from sc where rownum=1 order bydegree desc ;

或者  select no,cno from sc where degree = (selectmax(degree) from sc);


正确结果应该是 学号为103 课程号为3-105的数据.

so   第一种情况的思想是 按降序对成绩排列,然后查询如下


我理解为,rownum是在做新增行的时候就记录好每个行的顺序了.并且,它的顺序是按照RowId 的大小对应的。 

如图中,第二行的 RowId 这个物理ID是最小值,那么对应的RowNum也就是最低的.

so 我觉得Select no ,cno from sc where rownum=1 order bydegree desc ;这样的语句不能满足查出最大值

因为,rownum=1则找到第一次插入此表的数据

做一个实验,删掉NO为105的行,即RowNum =2 RowId = AAAOSaABBAAAABkAAB这行的数据

再重新插入来查看 新的 RowId和 RowNum

上图分析得出,rownum确实是和rowid对应,小的rowid对应小的rownum

则考试答案第一种结果是不正确的

应该改成

select * from (Select no ,cno from sc order bydegree desc ) where rownum=1; 其中红色部分其实是一张伪表

如图分析:

此时的rownum并不对应最小的RowId ,那不是自相矛盾吗?

再分析了下:从伪表中查出的数据默认是排序的,Rownum则有新的顺序

rowid只是物理行号地址而已

所以rownum一般建议是在查询中进行使用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值