星期三, 4月 14, 2010

用Oracle的ROWNUM抓取特定筆數 - 資料排序卻不是我們要的

原本認為這樣可以抓到我們要的前5筆資料
但排序卻是錯亂的
select *
from emp
where ROWNUM <= 5
order by sal desc;
以語法來看是~抓出前5筆資料
而且是先依照我們要的以sal由大到小排列

但實際上Oracle卻不是這麼做
以案例來說~
Oracle卻是先將emp資料庫裡先標記序號
再取出前5筆後
最後依order by 排序
所以咧~就發生慘案啦

原本我們要的做的query是
用 2個select
將查詢後的資料以50筆為單位
分次query出來
但資料排序會錯亂
最後依照Oracle官方文件改成以 3個select

Oracle官方說明文件 On ROWNUM and Limiting Results
以下為Oracle語法處理的順序
Think of it as being processed in this order:

1. The FROM/WHERE clause goes first.
2. ROWNUM is assigned and incremented to each output row from the FROM/WHERE clause.
3. SELECT is applied.
4. GROUP BY is applied.
5. HAVING is applied.
6. ORDER BY is applied.

沒有留言: