下面是關於rownum的介紹
******************************==
三、 rownum和row_number() over()的使用
rownum是oracle從8開始提供的乙個偽列,是把sql出來的結果進行編號,始終從1開始,常見的用途就是用來分頁輸出.
比如 select *
from torderdetail a
where rownum <= 10
這條語句就是輸出前10條紀錄,在這裡用途上類似於sql sever的top,不過rownum對於指定編號區間的輸出應該說更強大
select *
from (select a.*, rownum rn
from torderdetail a)
where rn >= 10 and rn <= 20
這條語句即是輸出第10到第20條紀錄,這裡之所以用rownum rn,是把rownum轉成例項,因為rownum本身只能用 <=的比較方式,只有轉成實列,這樣就可做 >=的比較了。
在實際用途中,常常會要求取最近的幾條紀錄,這就需要先對紀錄進行排序後再取rownum <=
一般常見的
select *
from (select a.*
from torderdetail a
order by order_date desc)
where rownum <= 10
而在csdn曾經發生過討論,關於取近的10條紀錄,有人給出這樣的語句
select a.*
from torderdetail a
where rownum <= 10
order by order_date desc
之所以會出現這樣的語句,主要是從效率上的考慮,前面條語句,是要進行全表掃瞄後再排序,然後再取10條紀錄,後一條語句則不會全表掃瞄,只會取出10條紀錄,很明顯後條語句的效率會高許多。
那為什麼會有爭議呢,那就在於在執行順序上爭議,是先執行排序取10條紀錄,還是取10條紀錄,再排序呢?兩種順序取出來的結果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀錄。對於此語句,普遍的認為執行順序是先取10條紀錄再排序的。所以此語句應該是錯誤。但實際上並非如此,此語句的執行順序和order by的字段有關係,如果你order by 的字段是pk,則是先排序,再取10條(速度比第一種語句快),而排序字段不是pk 時,是先取10條再排序,此時結果就與要求不一樣了,所以第二種寫法一定要在排序欄位是主鍵的情況下才能保證結果正確。
row_number() over()這個分析函式是從9i開始提供的,一般的用途和rownum差不多。
一般寫法row_number() over( order by order_date desc) 生成的順序和rownum的語句一樣,效率也一樣(對於同樣有order by 的rownum語句來說),所以在這種情況下兩種用法是一樣的。
而對於分組後取最近的10條紀錄,則是rownum無法實現的,這時只有row_number可以實現,row_number() over(partition by 分組字段 order by 排序字段)就能實現分組後編號,比如說要取近乙個月的每天最後10個訂單紀錄
select *
from (select a.*,
row_number () over (partition by trunc (order_date) order by order_date desc)
rn from torderdetail a)
where rn <= 10
rownum的另類用法,有時候我們會遇到這種需求,要求輸出當月的所有天數,許多人會煩惱,資料庫裡又沒有這樣的表,怎麼輸出乙個月的所有天數呢?用rownum就能解決:
select trunc (sysdate, 'mm') + rownum - 1
from dual
connect by rownum <= to_number (to_char (last_day (sysdate), 'dd'))
Oracle前10條記錄
在oracle怎樣查詢表中的top10條記錄呢?select from test where rownum 10 下面是關於rownum的介紹 rownum和row number over 的使用 rownum是oracle從8開始提供的乙個偽列,是把sql出來的結果進行編號,始終從1開始,常見的用...
Oracle中查詢前10條記錄
在oracle 怎樣查詢表中的top10條記錄呢?select from test where rownum 10 下面是關於rownum的介紹 rownum和row number over 的使用 rownum是oracle從8開始提供的乙個偽列,是把sql 出來的結果進行編號,始終從1開始,常見...
ORACLE獲取資料庫表的前N條記錄
我剛開始修改乙個用oracle資料庫專案時,用sql select top 4 from table的方法想取得oracle資料庫表的前n條記錄 弄了很久老是出錯,後來才知道錯了 oracle得 用rownum n,不能用top 順便把網上的其它資料庫也記下 1.oracle select from...