Oracle数据库没有像MSSQL中的Top,所以分页需要使用rownum。
如果需要按某个字段排序后再分页,常常会出现分页混乱问题,因为排序后的rownum已经因为排序而被打乱了。
很多人会使用嵌套SQL语句的方法分页,效率极低,经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按该字段排序。
下面是一个分页的例子,分别列举了使用子查询低效率分页和高效分页:
select * from tabname where rownum<20 order by name
但却发现oracle却不能按自己的意愿来执行,而是先随便取20条记录,然后再 order by。原因是rownum是在orderby之前就已经产生了,orader by实际打乱了原先的rownum,所以取出来的不是自己想要的结果。
为了实现功能,我们可以用子查询:
select * from (select * from tabname order by name) where rownum<20
但这样一来,效率会较低很多。
正确的做法是:
在Name字段加上索引,然后再使用 select * from tabname where rownum<20 order by name 即可得到想要的分页结果了。