首页  ·  知识 ·  数据库
Oracle中的rownum与OrderBy之间的关系
网友  阿福的技术BLOG    编辑:德仔   图片来源:网络
SQLSERVER中,如果TOP关键字和ORDER BY关键字一起出现,是先ORDER BY 后再TOP。也就是说:取得最前面的几条记录是经过排序的。br /&
  SQLSERVER中,如果TOP关键字和ORDER BY关键字一起出现,是先ORDER BY 后再TOP。也就是说:取得最前面的几条记录是经过排序的。
   而ORACLE中,如果使用WHERE rownum<=N和ORDER BY一起出现的话,ROWNUM优先于ORDER BY。也就是说,ORDER BY无法对所有满足条件的记录排序,只能对当前的rownum<=N中的N条记录排序。
   看下面这个分页的查询:
SELECT LimitResult.*
FROM
(
    SELECT *, rownum AS r
    FROM ATable
    WHERE rownum<=40
    ORDER BY createTime DESC
) LimitResult
WHERE LimitResult.r>20
--每页20条,取第二页

   查询的结果中,仅仅只是对当前页的CreateTime进行了倒序排列,并没有按照所有记录的倒序排列。说明rownum的限制优先于ORDER BY。不得已把查询修改成下面的样子:
SELECT LimitResult.*
FROM
(
 SELECT OrderResult.*, rownum AS r
 FROM
 (
        SELECT *
        FROM ATable
        ORDER BY createTime DESC
 ) OrderResult
 WHERE rownum<=40
) LimitResult
WHERE LimitResult.r>20
明显效率没有以前高了,但是没办法。

 
本文作者:网友 来源:网络阿福的技术BLOG
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读