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
明显效率没有以前高了,但是没办法。

    以上就是我发现的规律,希望朋友们能提出更好的办法。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值