e1里面的rownum是不是不需要寫的?
就算是查e1集合的rownum,感覺查出來的只是原生數(shù)據(jù)行里面的天然順序行號(hào),后面e2也沒調(diào)用e1的rownum。
這道題最后寫的SQL,我的理解是:
e1只是用來排序的,rownum的生成機(jī)制是在排序前也就是select的同時(shí)進(jìn)行編號(hào),根本來不及重新編號(hào)
然后真正開始給排序好的記錄行進(jìn)行編號(hào)是在e2里面完成的,由于rownum的機(jī)制是執(zhí)行select的同時(shí)編號(hào)一次,也就是標(biāo)一下當(dāng)前select出來的記錄行的rownum,要想維持編號(hào)動(dòng)作的正常運(yùn)行(rownum順利完成1到8的編號(hào)),就要讓where在第8行之前要保持為真(不然直接寫rownum>=5,rownum會(huì)在最開始編號(hào)的時(shí)候直接給中斷了,因?yàn)?不會(huì)大于5,where為假,也就沒有后續(xù)的2、3、4等行號(hào)),所以在e2里面先過濾出行號(hào)小于8的記錄行。
但是因?yàn)榇藭r(shí)e2已經(jīng)編號(hào)到8了,編號(hào)到8就意味著e2這個(gè)select結(jié)果集里面也有了1、2、3、4這幾行我們不想要的(又因?yàn)閟elect和rownum是同時(shí)進(jìn)行的),然后將e2的編號(hào)結(jié)果rownum寫個(gè)別名r作為新的列,在最外層的主查詢里面調(diào)用這列,因?yàn)榕crownum無關(guān)成為了單純的數(shù)據(jù)列,就可以在最外層拿這一列進(jìn)行過濾
然后過濾掉8后以后的操作也可以統(tǒng)一放在最外層來做
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