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#;

解释:

  1. 使用子查询:将原始查询语句放在子查询中,并使用 ROW_NUMBER() 函数生成一个排序列 rn
  2. ROW_NUMBER() 函数:该函数按照 cssjxh 列降序排列数据,并为每一行分配一个序号。
  3. 外层查询过滤:使用 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 著作权归作者所有。请勿转载和采集!