步骤 2 : 查出薪水最高的5-10条数据 select * from hr.employees e where rownum<=5 select * from
(select rownum r, e1.* from
(
select e.* from hr.employees e order by e.salary desc
) e1
) e2 where e2.r >=5 and e2.r<=10
select * from (select rownum r, e1.* from ( select e.* from hr.employees e order by e.salary desc ) e1 ) e2 where e2.r >=5 and e2.r<=10
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2018-01-05
为什么有最外面那一层,而不是两层
7 个答案
我会努力学JAVA的 跳转到问题位置 答案时间:2019-06-27 首先薪水最高的
超越所有人 跳转到问题位置 答案时间:2018-12-25 因为rownum得运行机制问题,所以呢,你当前查得是当前生成得e1的rownum,所以查看出来的第一条数据其给它附的id为1,然后你后面有执行e1.r的判断,所以那个e1的第一条数据(id为1)不符合大于等于5小于等于10,第一条不符合,那么它就会执行销毁,所以本来的第二条也会成为id为1,然后继续执行,所以第二条也不符合,如果想使它符合,那么只能让e1.r大于0即可,否则其它条件都是不可以的,如果你想让其大于1或者及以上,就必须多包涵一层,让其变成一个数据集,再从数据集里面取就可以取到(这就是为什么要多取一层的原因),不然你执行这个语句,一条数据都没有而且还会报错
SuperKuma 跳转到问题位置 答案时间:2018-04-24 试了一下 rownum <> 8 也查不出8后面的元素,怕是rownum 碰到不符合条件的就终止了
啾啾啾 跳转到问题位置 答案时间:2018-04-02 首先,看报错,是e1.r标识符无效,这是为什么呢?
因为你的e1里面压根没有r。
你新建的r列,是在你的最外层的select运行之后才会形成的一个表里面的。
并不在你括号里面select运行后所形成的表里面。
ps:我的不成熟的理解就是每次的select之后都会形成一个新的表。你仔细断句一下应该能理解上面的最后一句话
提莫小可爱 跳转到问题位置 答案时间:2018-03-14 百度到的答案
因为rownum是对结果集加的一个伪列(即先查到结果集之后再加上去的一个列),简单的说rownum是对符合条件结果集添加的序列号。它总是从1开始排起的,所以选出的结果中不可能没有1,而有其他大于1的值。
rownum > 5 AND rownum <= 10 查询不到记录,因为如果第一条的 rownum = 1,不满足条件被去掉,第二条的rownum又成了1,继续判断,所以永远没有满足条件的记录。
XF 跳转到问题位置 答案时间:2018-02-01 好像是因为分页rownum每次查只能从第一条记录开始,即如果是小于5就不用套最外面这一层,但是大于五小于十就需要。
YinTi 跳转到问题位置 答案时间:2018-01-28 你的e1查询出来的是薪水由高到低的排序,你在where条件里面查询的e1代表的也是薪水而不是行数,所以新加了e2,查询条数
select * from (select rownum r,sa.*from (select * from hr.employees order by salary desc) sa) sal where sal.r>=5 and sal.r<=10
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|