论坛首页 Java企业应用论坛

Oracle分页SQL

浏览 10767 次
锁定老帖子 主题:Oracle分页SQL
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (5)
作者 正文
   发表时间:2009-05-08   最后修改:2009-05-08
ORACLE分页一直是比较麻烦的一件事情,它没有MYSQL的LIMIT关键字,只有通过伪列ROWNUM来实现,如果不用排分页其实很简单,在此不述。
排序分页中如果要排序的字段有很多相同值的情况下只使用2层嵌套查询则可能出现数据混乱,所以只能采用三层嵌套查询。
排序分页使用下面的嵌套语句:
select * from (select rownum as r,t.* from(select tableName.* from tableName order by tableColum DESC) t where rownum<=endPos) where r>startPos

目前在hibernate3.1及以下的版本中好像没有采用这种三层嵌套查询(3.2我没试过)所以要在hibernate中实现排序分页只有自己写SQL语句了。
看来我们想完全依赖hibernate来实现一些常规的查询还是会有一点的困难。
而且三层嵌套的语句在阅读上并不直观。
相对说MYSQL的LIMIT用起来就比较舒服了,很简洁。
不知道这次ORACLE收购SUN会不会把MYSQL中的LIMIT给加入到自己的产品中去。
让我们拭目以待吧

   发表时间:2009-05-08  
非常不美观、、
1 请登录后投票
   发表时间:2009-05-08  
select * from (
select rownum as r,t.* from(
select tableName.* from tableName order by tableColum DESC
) t where rownum<=endPos) where r>startPos 
我只想说一句  排序放错地方了
1 请登录后投票
   发表时间:2009-05-15  
SELECT x.* from (  
     SELECT z.*,rownum numbers from(select * from tableName order by tableColum ) z  
     where rownum<maxNum) x   
where x.numbers>minNum 
0 请登录后投票
   发表时间:2009-05-16  
Hibernate3里早就有了..
自己看看Dialect..
0 请登录后投票
   发表时间:2009-05-17  
是啊,Dialect中有各种数据库截取数据处理过程
0 请登录后投票
   发表时间:2009-07-02  
jacklondon 写道
SQL standard 2003 新带来的 SQL 窗口函数(Window function) ROW_NUMBER() OVER () , 数据库 SQL server 2005/DB2/Oracle 都支持,Oracle 与标准略为有点差别。 Mysql/PostgreSQL 则不支持 ROW_NUMBER()。
我觉得还是 limit 最好用。只是不知道为什么其他数据库厂商都不用,也不知道 SQL 标准委员会为什么不用,不知道有没有中国人在SQL 标准委员中。


我为postgresql 捐献过代码, 也在postgresql 全球开发组中混过几天, 大部分数据库不支持limit x offset y的原因是存储设计的时候没有考虑到这个问题。而且从海量存储的角度上来说, 在当时(上世纪70年代末) 的条件和技术,也没法实现这个功能。

postgresql , mysql 起步都比较晚, 而且postgresql 也起源于一个学院内部的实验项目,所以在其中包含一些超前的设计也是在情理之中的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics