e1里面的rownum是不是不需要写的?

来源:5-2 案例1

风铃在想什么

2021-05-04 15:38

就算是查e1集合的rownum,感觉查出来的只是原生数据行里面的天然顺序行号,后面e2也没调用e1的rownum。

这道题最后写的SQL,我的理解是:

e1只是用来排序的,rownum的生成机制是在排序前也就是select的同时进行编号,根本来不及重新编号

然后真正开始给排序好的记录行进行编号是在e2里面完成的,由于rownum的机制是执行select的同时编号一次,也就是标一下当前select出来的记录行的rownum,要想维持编号动作的正常运行(rownum顺利完成1到8的编号),就要让where在第8行之前要保持为真(不然直接写rownum>=5,rownum会在最开始编号的时候直接给中断了,因为1不会大于5,where为假,也就没有后续的2、3、4等行号),所以在e2里面先过滤出行号小于8的记录行。

但是因为此时e2已经编号到8了,编号到8就意味着e2这个select结果集里面也有了1、2、3、4这几行我们不想要的(又因为select和rownum是同时进行的),然后将e2的编号结果rownum写个别名r作为新的列,在最外层的主查询里面调用这列,因为与rownum无关成为了单纯的数据列,就可以在最外层拿这一列进行过滤


然后过滤掉8后以后的操作也可以统一放在最外层来做

select r,empno,ename,sal

  2  from (select rownum r,empno,ename,sal

  3          from (select empno,ename,sal from emp order by sal desc) e1

  4                  ) e2

  5  where r>=5 and r<=8;


写回答 关注

1回答

Oracle高级查询

数据库开发中应用广泛的高级查询,本教程通过大量的案例详细讲解

62861 学习 · 144 问题

查看课程

相似问题