Oracle分页查询


签于现在的WEB应用数据量都非常大,采用数据库成为必然选择。一方面数据库服务器的性能往往高一些。

再者省去把大量数据装成对象的过程(OOP开发).一开始你会发现这样写是行不通的:
select * from aTable where rownum between 15 and 24
这里因为ROWNUM 列只有在记录被取出时,即执行SELECT时[数据库原理上叫投射],才会应用到记录。

第一行在被取出时会被抛出,因为它的 ROWNUM 是1。然后,下一行被取出;它也会被抛出,因为它是新的1,

以此类推,直到所有的行都被使用。这个查询不会返回任何记录。

解决这一问题材方法是先取出1到24行的记录:
select * from aTable where rownum <=24;
然后,你可以将它作为一个子查询并过滤掉开始点之前的所有记录(注意我必须为“rownum”提供一个别名才能编译): 
select * from (select rownum RN,aTable.* from aTable where rownum <=49) vds
where vds.RN >= 15.

这样还有一个问题,就是ORDER BY是在SELECT之后执行的,如查这样写:
select rownum RN,aTable.* from aTable where rownum <=24 ORDER BY sex
那么返回的记录也许并不是你想要的(比如班组前名).他们结果是取出前24条再排序。那么这前24名学生就参差不齐了。

可行的解决的方法,先把从排好序的结果集取出数据:
select * FROM(
select rownum RN,vds.*
from (select aTable.* from aTable Order by sex)vds
where rownum <=24)
where RN > 15.

posted @ 2009-02-16 16:05  Christmas  阅读(187)  评论(0编辑  收藏  举报