Oracle的內建分頁虛擬列rownum的用法

2021-04-12 15:33:25 字數 1803 閱讀 3116

在研究hibernate的分頁方法query.setfirstresult和query.setmaxresults方法時:

setsession.createquery(selecthql).setfirstresult(firstresult).setmaxresults(maxresult).list();

把sql列印出來,發現sql語句中是根據rownum來分頁的,以前就知道,只是沒有去用sql來實現。這次發現了

乙個細節問題。特意發上來備案。

rownum:oracle在建表的時候會給每個表分配乙個虛擬列,也可以說隱藏列,是看不見的。如其意,用數字來

標識每一行,第一行為1,第二行為2,如此類推.實現分頁時,它很有效.

情況1: 在沒有group by ,order by 的sql裡,rownum能很好的在where裡使用,例子:

select t.*,rownum tt from ds_keyword_day_count_num t where rownum <10,這裡的rownum會預設

使用該錶的primary key來分配數字.

select t.*,rownum tt from ds_keyword_day_count_num t where rownum<100 order by t.id desc

情況2: 有group by,order by的sql裡,查詢得到的結果是整理過的

2.1 要獲得分組排序後的第一行:

select dd.* from (select t.*,rownum tt from ds_keyword_day_count_num t

order by t.id desc) dd where rownum =1

2.2 要獲得分組排序後的前100行:

select rown_.*,rownum rownu_ from (select * from ds_keyword_day_count_num t

order by t.id desc) rown_ where rownum<100

2.3 要獲得分組排序後的第50行到100行:

select tt.*,rownum rr from(select rown_.*,rownum rownu_ from

(select * from ds_keyword_day_count_num t order by t.id desc) rown_

where rownum<100) tt where rownu_>50

注意:這裡是使用別名rownu_來做 >50 的條件,在巢狀的第2個select裡把rownum作為乙個欄位先儲存起來,

之後再最外層的select來對這個rownu_(別名)進行正常的 >操作.

使用rownum直接 > 操作是不行的.需要分兩步操作.這裡可從hibernate生成的sql裡看出.

如果一步操作-----

如: select rown_.*,rownum rownu_ from (select * from ds_keyword_day_count_num t order by t.id desc) rown_

where rownum<100 and rownum>50

會返回空.原因是

參考文件:oracle 9i sql reference的rownum描述的:

對於rownum的條件測試如果是大於乙個正整數會返回false,當游標移動到第一行時,會給rownum賦為1,這時返回false,

當游標從第2行開始時select時,rownum又重新賦予1,這樣如此反覆,始終返回false.

所以對rownum的大於操作是無效的,需要如2.3的把rownum值賦予乙個別名來判斷

oracle 偽列rownum 與 分頁

因為rownum是對結果集加的乙個偽列,即先查到結果集之後再加上去的乙個列 強調 先要有結果集 簡單的說 rownum 是對符合條件結果的序列號。它總是從1開始排起的。所以你選出的結果不可能沒有1,而有其他大於1的值。所以select from tab1 where rownum n n大於1 是得...

oracle分頁 使用rownum 偽列

connected to oracle database 10g enterprise edition release 10.2.0.1.0 connected as tudou sql select from temp1 name age 土土 22 z壯 23 z 25 a 28 奇才 29 才...

oracle 11g中的虛擬列

在oracle 11g中,支援虛擬列,注意虛擬列是可以根據其他列動態計算出來的,語法 column name datatype generated always as expression virtual 例子 create table employee empl id number,empl nm...