Oracle分頁問題

今天在公司遇到一個分頁查詢的bug,查詢第一頁能夠查詢到數據,下面也顯示的沒有問題!查詢第二頁時,顯示已經加載完成,可是頁面沒有問題!sql

經過Debug調試,發現第一頁查詢到的數據沒有問題,第二頁時,查不到數據!oracle

第一頁時,控制檯打印的sql語句:spa

 

SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
FROM 
    ( SELECT m.*,rownum row_id 
       FROM (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY FROM WKF_BUSINESS_CONFIG ) m 
        WHERE rownum >= 1) 
where row_id < 26 

 

第二頁時,控制檯打印的sql語句:調試

SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
FROM 
    ( SELECT m.*,rownum row_id 
       FROM (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY FROM WKF_BUSINESS_CONFIG ) m 
        WHERE rownum >= 26) 
where row_id < 51 

經過分析和查詢oracle分頁的知識,發現是SQL語句有問題!code

不能對ROWNUM使用>(大於1的數值)、>=(大於或等於1的數值)、=(大於或等於1的數值),不然無結果
-- 因此直接用只能從1開始
-- rownum >10 沒有記錄,由於第一條不知足去掉的話,第二條的rownum又成了1,因此永遠沒有知足條件的記錄。
blog

正好,查詢第二頁的時候,上面的sql語句犯了這個問題!it

既然不能>=(大於或等於1的數值),那我就讓rownum<大於1的數!class

SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
FROM 
     ( SELECT m.*,rownum row_id 
       FROM 
            (SELECT OBJ_NAME, OBJ_ATTRIBUTE_NAME, ATTRIBUTE_TYPE, DES, STS, PRIORITY 
             FROM WKF_BUSINESS_CONFIG ) m 
             WHERE rownum <51) 
where row_id >= 26 

 

將sql語句改爲這樣時,按照要求能夠查詢到數據!select

既然遇到了Oracle分頁查詢的問題,正好複習下Oracle分頁的相關知識!sql語句

在Mysql中,分頁查詢很簡單!    分頁查詢使用的是limit關鍵字進行查詢。它後面有兩個參數

第一個參數是起始的位置,第二個參數是每頁須要顯示的條目數。

舉例:商品表中有10條記錄,如今須要進行分頁顯示,每頁顯示3條數據。如今須要查看第二頁的數據。那麼應該使用的sql語句是:

    select * from product limit 3,3;                     第一個參數計算的公式爲:(查詢的頁數-1)*每頁顯示條目數    即 (2-1)*3=3

在Oracle中分頁就沒有那麼簡單!Oracle中是經過rownum實現分頁查詢的!

 

不能對ROWNUM使用>(大於1的數值)、>=(大於或等於1的數值)、=(大於或等於1的數值),不然無結果
因此直接用只能從1開始
rownum >10 沒有記錄,由於第一條不知足去掉的話,第二條的rownum又成了1,因此永遠沒有知足條件的記錄
select * from student where rownum>=1;

 

若是想要用rownum不從1開始,需按下面方法使用
select a1.* from (select student.*,rownum rn from student) a1 where rn >5

分頁查詢一
select * from (select a1.*,rownum rn from (select * from student) a1 where rownum <=5) where rn>=2;

 

分頁查詢二
select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where rn >=3;

 

分頁查詢三
select a1.* from (select student.*,rownum rn from student) a1 where rn between 3 and 5;

相關文章
相關標籤/搜索