因為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;
這裡有一個點需要注意:當多表關聯中有涉及到兩張表都有同一個名稱的字段是,如:

那麼,需要将其他的同名稱的字段取一個别名用來區分,否則查詢會報錯: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。