SQL中rownum和order by的執行順序的問題

風靈使發表於2018-04-18

在一個SQL中,如果同時使用rownumorder by,會有一個先後順序的問題。

比如select id1,id2 from t_tablename where rownum<3 order by c_date desc ,這個語句會先從結果集中取前三條記錄,再對這3天記錄按日期排序。如果設計者向先對日期排序,再取前三天記錄,那麼就不會得到正確的結果。

所以rownumorder by一起使用的時候一定要注意的執行順序的問題。

這句可以這樣實現

select id1,id2 from (select id1,id2 from t_tablename order by c_date desc) where rownum<3

rownum先排序後分頁

今天突然想到rownum可以解決分頁問題,於是做了各種實驗,找個幾個文章,最後有了一定成果。

現有表tablename,含有欄位showorder,要求提取showorder的第11行到20行資料。

用語句select rownum r,a.* from tablename a order by showorder進行查詢的時候會發現結果集中rownum是在排序之前賦的值,因此如果需要按showorder提前的話應該先將tablenameshoworder排序,將排序後的結果集按rownum提取。

語句

SELECT ROWNUM r, a.* FROM (select * from tablename order by showorder) a WHERE ROWNUM <= 20 

可以查出前20條,但如果過濾條件變成rownum<=20 and rownum >=10,就會發現結果集一條資料都沒有,因為rownum是提取資料,將資料操作完成之後再進行標記行號,關於這點,有個作者寫的很好http://blog.csdn.net/greenappple/article/details/6872660,大家可以看看。

剩下的操作是將標記好行號的前20條資料提取後十條。

SELECT *  FROM (SELECT ROWNUM r, a.* FROM (select * from tablename order by showorder) a WHERE ROWNUM <= 20 )  WHERE r >= 11;

上面的語句用plsql執行時用了0.078秒,等同於plsql查詢上千行的表時只查處了前十條的時間。

網上有很多好文章寫著塊的,此處只記載了適用於我的方面。

相關文章