首页 > Database, Oracle > oracle 分页排序的两种方式

oracle 分页排序的两种方式

2008年12月22日 发表评论 阅读评论

我们都知道oracle  的rownum 是一个伪列, 它会在select 之后就产生, 先于from xxx (更加不用说where xxx 和 order , group 了) , 所以如果你不排序的话,下面这种典型的oracle 分页语句是可以的:

1
2
3
4
5
SELECT * FROM 
 
(SELECT t.*,rownum row_num FROM mytable t ) b 
 
WHERE b.row_num BETWEEN 1 AND 10

或者也可以是Hibernate 里面严格的 大于 小于格式 , 记得一定要先小于.

1
2
3
4
5
SELECT * FROM 
 
(SELECT t.* , rownum FROM mytable t WHERE t.rownum<100 ) b
 
WHERE b.rownum > 50 .

但是如果要排序的话,由于rownum 是先于from 语句的(更加不用说where 和order 了), 所以必须要先嵌套:

排序分页的第一种方式:

1
2
3
4
5
6
7
SELECT * FROM 
 
(SELECT a.*,rownum row_num FROM 
 
SELECT * FROM mytable t ORDER BY t.id DESC) a
 
) b WHERE b.row_num BETWEEN 1 AND 10

 

另外一种就是使用minus 操作

排序分页的第二种方式

1
2
3
4
5
6
7
8
9
10
11
SELECT rownum,page.*
    FROM ( SELECT Page.*
        FROM lb_sys_twork page
            WHERE page.state=1
            ORDER BY unit_code,
            code) Page    <br />        WHERE rownum &lt; 50 MINUS SELECT rownum,page.*
        FROM ( SELECT Page.*
            FROM lb_sys_twork page
            WHERE page.state=1
            ORDER BY unit_code,
            code) Page    <br />        WHERE rownum &lt; 30

参考资料

1 . http://www.duduwolf.com/post/74.asp

    minus  方式

2. http://www.blogjava.net/joessy/articles/1398.html

    嵌套方式

分类: Database, Oracle 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.