oracle 分页排序的两种方式
我们都知道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 < 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 < 30 |
参考资料
1 . http://www.duduwolf.com/post/74.asp
minus 方式
2. http://www.blogjava.net/joessy/articles/1398.html
嵌套方式