oracle 分页和TOP的SQL的说明

在这对经常用到的一个进行分页输出或者取TOP* 的SQL进行一下说明:
大家都能看明白经常用的写法有(没有排序):
1)select * from ( select rownum rn ,a.* from tablea ) where rn < 41 and rn > 19;
  2)select * from ( select rownum rn ,a.* from table a where rownum < 41 ) where rn > 19;
   这两中写法,推荐第二种,两种比较而言,第二种中间加载的数据集更小,更有优势。
对于有排序的情况,必须将排序单加一层查询:
1)select * from (select * ,rownum rn from ( select a.* from service a order by ID )) where rn < 41 and rn > 19;
2)select * from (select * ,rownum rn from ( select a.* from service a order by ID ) where rownum < 41 ) where rn > 19;
虽说IO的代价很小,但是还是有一定的性能优势的。
 
对于取top的,可以直接用rownum进行过滤:
(无排序): select a.* from tablea  where rownum <= 10;
(有排序):select* from (select * from table a order by ID ) where rownum <=10;

相关推荐