Oracle中的rownum与Order By之间的关系

 刚学ORACLE的时候,就先入为主地认为rownum是一种类似于SQLSERVER的TOP关键字一样的机制————起码咱们最常用的分页可以用这个搞定。
    事实并非如此,学习的时候,“空”是很重要的,以前的经验往往是一种坏处。
    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
明显效率没有以前高了,但是没办法。

posted @ 2010-04-01 18:36  QQ天堂  阅读(7987)  评论(0)    收藏  举报