来TOM上的blog挂掉了,现在准备看能找到多少。。。准备把技术相关的全部转到JAVAEYE上边来。。。恨死TOM了。。
原发表日期:2008-04-10
Oracle分页
我实在是不知道在一般情况下Oracle是怎么分页的。我觉得大概都是用ROWNUM吧。。。。。。
前些天的数据库笔试(尤其是东软的),我觉得真的的是很难啊。。。。很多的东西都不知道。。。有的学的时候也只是稍微提了一下。。。。。。还是差得很远啊。。。。
我是不知道在实际工作中到底经常用不用这些东西。。。不过说句实话。。。我没有在太大的公司呆过。。。他们一般写东西都使用Hibernate、Ibatis之类的还用。。。尤其是Hibernate,一般的分页查询他都是写好的。
在用Hibernate的时候显示出来的用于分页的句子:
SELECT t.ROWNUM, t* FROM(
SELECT t.ROWNUM, t.* FROM TABLE_NAME t
WHERE t.ROWNUM<341
)WHERE t.ROWNUM>335;
ROWNUM是ORACLE的一个“伪列”,顾名思义,就是说其实在一列是不存在于实际的表中的。。。。。。。在一列是在查询之后才给每一结果加上去的。。。也就是说。。。你要是直接查“SELECT t.ROWNUM, t.* FROM TABLE_NAME t WHERE t.ROWNUM>15”这句话是没有任何的意义的。。。。ROWNUM是在结果查出来以后赋值上去的。。。要是这样子写的话永远也没有结果的。。。。。不过要是查ROWNUM=1的话是有一个结果的。。。。。比1大的自然数就不行了。。。
但是如果遇到要按照某一列进行排序的话。。。好像就比较麻烦了。。。。。
我知道的情况是这样子的:
(假设表里有ID字段按照ID排序查出第115条到145条的的记录)
SELECT t.ROWNUM, t* FROM(
SELECT t.ROWNUM, t.* FROM(
SELECT t.* FROM TABLE_NAME t ORDER BY t.ID DESC
)
WHERE t.ROWNUM<341
)WHERE t.ROWNUM>335;
好想看起来很繁琐。。。不过我也不清楚其他的方法了。。。。。。。
好像也可以用WHERE t.ROWNUM BETWEEN 335 AND 341,不过我认为速度上可能还是要比上边的慢。。。。