e1里面的rownum是不是不需要写的?
就算是查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;