Oracle 分页最佳实践:正确使用ROWNUM实现分页
Oracle 中可以使用 'ROWNUM' 关键字来进行分页,但是要注意 'ROWNUM' 的使用方式。
以下是修改后的正确分页语句:
SELECT *
FROM (
SELECT xS.*, ROW_NUMBER() OVER (ORDER BY cssj, xh DESC) AS rn
FROM xS
)
WHERE rn >= #startnum# AND rn < #endnum#;
解释:
- 使用子查询:将原始查询语句放在子查询中,并使用
ROW_NUMBER()
函数生成一个排序列rn
。 ROW_NUMBER()
函数:该函数按照cssj
和xh
列降序排列数据,并为每一行分配一个序号。- 外层查询过滤:使用
WHERE
子句过滤rn
列,仅保留#startnum#
到#endnum#
之间的行,实现分页效果。
为什么不可以用 rownum>=#startnum# and rownum<#end num#order by cssj,xh desc;
进行分页?
因为 ROWNUM
是 Oracle 访问数据时动态生成的,它是在数据被返回之前分配的。所以,在 WHERE
子句中使用 rownum
进行过滤会导致结果不符合预期。例如,如果 #startnum#
为 2,那么 rownum>=#startnum#
将只保留从第 2 行开始的数据,而 rownum<#end num#
将过滤掉超过 #end num#
的所有数据。这会导致最终结果不包含你想要的第 2 到 #end num#
之间的数据。
总结:
使用 ROW_NUMBER()
函数结合子查询是进行 Oracle 分页的最佳实践,它可以确保分页结果的准确性和效率。
原文地址: https://gggwd.com/t/topic/bfHs 著作权归作者所有。请勿转载和采集!