在sql server中可以通過SELECT TOP N來取得想要結果的前幾行的信息。
但是在oracle中必須借助偽列rownum來完成
一個查詢語句在取得結果集后,偽列rownum就會從1開始,從上往下依次遞增。rownum是對結果集的編序排列。例如下表:
SQL> select id,name,salary,rownum from wages;
ID NAME ? ? ? ? ? SALARY ? ? ROWNUM
---------- ---------- ---------- ----------
1 zhangsan ? ? ? ? 3600 ? ? ? ? ?1
2 lisi ? ? ? ? ? ? 2500 ? ? ? ? ?2
3 wangwu ? ? ? ? ? 5000 ? ? ? ? ?3
4 zhaoliu ? ? ? ? ?4500 ? ? ? ? ?4
5 xiaoming ? ? ? ? 2000 ? ? ? ? ?5
所以取得該表的前三行,為
SQL> select id,name,salary,rownum from wages where rownum<=3;
ID NAME ? ? ? ? ? SALARY ? ? ROWNUM
---------- ---------- ---------- ----------
1 zhangsan ? ? ? ? 3600 ? ? ? ? ?1
2 lisi ? ? ? ? ? ? 2500 ? ? ? ? ?2
3 wangwu ? ? ? ? ? 5000 ? ? ? ? ?3
但是,這樣直接取表的前N行一般是無意義的。rownum一般是和order by搭配使用,通過排序,再取得自己想要的前幾行。
但是在使用rownum的時候要注意,使用排序后,返回的結果順序是進行了排序,但是rownum還是和原來的一樣,沒有隨著排序而改變。
原因:ROWNUM的編排在排序之前就產生了。
SQL> select id,name,salary,rownum from wages order by salary;
ID NAME ? ? ? ? ? SALARY ? ? ROWNUM
---------- ---------- ---------- ----------
5 xiaoming ? ? ? ? 2000 ? ? ? ? ?5
2 lisi ? ? ? ? ? ? 2500 ? ? ? ? ?2
1 zhangsan ? ? ? ? 3600 ? ? ? ? ?1
4 zhaoliu ? ? ? ? ?4500 ? ? ? ? ?4
3 wangwu ? ? ? ? ? 5000 ? ? ? ? ?3
所以此時使用要取工資最高的前三名,就發生了錯誤的結果
SQL> select id,name,salary,rownum from wages where rownum<=3 order by salary;
ID NAME ? ? ? ? ? SALARY ? ? ROWNUM
---------- ---------- ---------- ----------
2 lisi ? ? ? ? ? ? 2500 ? ? ? ? ?2
1 zhangsan ? ? ? ? 3600 ? ? ? ? ?1
3 wangwu ? ? ? ? ? 5000 ? ? ? ? ?3
但是,我們可以需要嵌套一層子查詢來抽取排序好的數據
SQL> ?select id,name,salary,rownum from (select * from wages order by salary);
ID NAME ? ? ? ? ? SALARY ? ? ROWNUM
---------- ---------- ---------- ----------
5 xiaoming ? ? ? ? 2000 ? ? ? ? ?1
2 lisi ? ? ? ? ? ? 2500 ? ? ? ? ?2
1 zhangsan ? ? ? ? 3600 ? ? ? ? ?3
4 zhaoliu ? ? ? ? ?4500 ? ? ? ? ?4
3 wangwu ? ? ? ? ? 5000 ? ? ? ? ?5
此時,rownum已經發生了變化,在通過外部查詢指定范圍,就可以得到想要的正確結果
SQL> select id,name,salary,rownum from (select * from wages order by salary) where rownum<=3;
ID NAME ? ? ? ? ? SALARY ? ? ROWNUM
---------- ---------- ---------- ----------
5 xiaoming ? ? ? ? 2000 ? ? ? ? ?1
2 lisi ? ? ? ? ? ? 2500 ? ? ? ? ?2
1 zhangsan ? ? ? ? 3600 ? ? ? ? ?3
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/31386161/viewspace-2128815/,如需轉載,請注明出處,否則將追究法律責任。