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;
2022-03-29