在一个SQL中,如果同时使用rownum
和order by
,会有一个先后顺序的问题。
比如select id1,id2 from t_tablename where rownum<3 order by c_date desc
,这个语句会先从结果集中取前三条记录,再对这3天记录按日期排序。如果设计者向先对日期排序,再取前三天记录,那么就不会得到正确的结果。
所以rownum
和order by
一起使用的时候一定要注意的执行顺序的问题。
这句可以这样实现
select id1,id2 from (select id1,id2 from t_tablename order by c_date desc) where rownum<3
用rownum
先排序后分页
今天突然想到rownum
可以解决分页问题,于是做了各种实验,找个几个文章,最后有了一定成果。
现有表tablename
,含有字段showorder
,要求提取showorder
的第11行到20行数据。
用语句select rownum r,a.* from tablename a order by showorder
进行查询的时候会发现结果集中rownum
是在排序之前赋的值,因此如果需要按showorder
提前的话应该先将tablename
按showorder
排序,将排序后的结果集按rownum
提取。
语句
SELECT ROWNUM r, a.* FROM (select * from tablename order by showorder) a WHERE ROWNUM <= 20
可以查出前20
条,但如果过滤条件变成rownum<=20 and rownum >=10
,就会发现结果集一条数据都没有,因为rownum
是提取数据,将数据操作完成之后再进行标记行号,关于这点,有个作者写的很好http://blog.csdn.net/greenappple/article/details/6872660,大家可以看看。
剩下的操作是将标记好行号的前20
条数据提取后十条。
SELECT * FROM (SELECT ROWNUM r, a.* FROM (select * from tablename order by showorder) a WHERE ROWNUM <= 20 ) WHERE r >= 11;
上面的语句用plsql执行时用了0.078秒,等同于plsql查询上千行的表时只查处了前十条的时间。
网上有很多好文章写着块的,此处只记载了适用于我的方面。