今天在公司遇到一個分頁查詢的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;