刚学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
明显效率没有以前高了,但是没办法。
以上就是我发现的规律,希望朋友们能提出更好的办法。谢谢!
Oracle中的rownum与Order By之间的关系
最新推荐文章于 2023-07-19 10:06:45 发布