天天看點

oracle分頁怎麼查詢,Oracle的分頁查詢

因為Oracle不像MySQL一樣有limit函數來實作分頁查找,oracle要實作分頁查詢可使用關鍵字rownum來處理。使用rownum有以下幾點需要注意:

1、ROWNUM存在使用規則,在單個子查詢中,對于WHERE中的ROWNUM限制隻能使用

2、ROWNUM用于從查詢傳回的行的編号,傳回的第一行配置設定的是1,第二行是2,依此類推,這個僞字段可以用于限制查詢傳回的總行數,而且rownum不能以任何表的名稱作為字首;

下面通過rownum的三種方式來實作oracle的多表分頁查詢(單表也一樣):

1、通過子查詢的方式

select *

from (select row_.*, rownum rownum_

from (select u.login_name,u.name,d.name as name1,s.name as name2,s.url

from site_admin ad left join user u on ad.user_id = u.id

left join site s on ad.site_id = s.id

left join department d on u.dept_id = d.id) row_

where rownum <= 10)

where rownum_ > 0;

這裡有一個點需要注意:當多表關聯中有涉及到兩張表都有同一個名稱的字段是,如:

oracle分頁怎麼查詢,Oracle的分頁查詢

那麼,需要将其他的同名稱的字段取一個别名用來區分,否則查詢會報錯:ambiguous fields...

2、minus關鍵字-多次查詢

select u.login_name,u.name,u.sex,u.mobile,u.phone,u.email,d.name,s.name,s.url

from site_admin ad left join user u on ad.user_id = u.id

left join site s on ad.site_id = s.id

left join department d on u.dept_id = d.id where rownum <=10

minus

select u.login_name,u.name,d.name,s.name,s.url

from site_admin ad left join user u on ad.user_id = u.id

left join site s on ad.site_id = s.id

left join department d on u.dept_id = d.id where rownum <=5;

上面的sql中,查的是6~10的記錄,就把前10條記錄減去前5條記錄,但是這個看起來太啰嗦也很冗長,不太建議。

3、between...and...以及排序

select *

from (select row_.*, rownum rownum_

from (select u.login_name,u.name,d.name as name1,s.name as name2,s.url

from site_admin ad left join user u on ad.user_id = u.id

left join site s on ad.site_id = s.id

left join department d on u.dept_id = d.id

order by u.name asc) row_) b

where b.rownum_ between 0 and 10;

通過子查詢并且用between...and...方法也可以完成分頁查詢的操作,并且,有子查詢,我們可以對查詢結果進行排序,因為生成的rownum在order by操作的前面,為了保證排序結果一緻,需要先執行order by操作,這樣查詢之後的排序結果會一緻,第三種方法可以說是第一種方法的優化。

歡迎加入java交流群:280097991。