You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle旧版本ROWNUM分页查询如何同时获取总结果数

在旧版本Oracle中同时实现分页查询与获取总结果数

可以在同一条查询中完成,不需要单独执行两次查询。核心是使用**分析函数count(*) over()**来计算符合条件的总结果数,而不是用group by(你的尝试中用group by搭配ROWNUM是错误的,因为ROWNUM是每条数据的伪列,分组后会导致每条数据单独成组,无法得到正确的总条数)。

正确的SQL示例

SELECT total_results, id, description, name
FROM (
    SELECT 
        COUNT(*) OVER () AS total_results,
        id, description, name,
        ROWNUM AS rnum
    FROM (
        -- 先对符合条件的数据排序,避免ROWNUM排序问题
        SELECT id, description, name
        FROM TESTDATAITEM 
        WHERE description = 'test' AND name = 'foo'
        ORDER BY id
    ) sorted_data
) paginated_data
WHERE rnum BETWEEN 1 AND 10  -- 注意:Oracle的ROWNUM从1开始,0不会返回数据
ORDER BY rnum;

关键说明

  • 内层排序子查询:必须先对符合条件的数据进行排序,再生成ROWNUM。如果直接在带ROWNUM的查询里排序,ROWNUM会在排序前生成,导致分页结果不符合预期。
  • 分析函数COUNT(*) OVER ():这个函数会计算整个结果集(即符合WHERE条件的所有数据)的总行数,并且将这个数值附加到每一条数据上,这样分页后的每条数据都会带上总结果数。
  • ROWNUM的取值范围:Oracle的ROWNUM从1开始,所以BETWEEN 0 AND 9不会返回第一条数据,改成BETWEEN 1 AND 10才能正确获取前10条。

为什么你的group by尝试失败?

你之前的查询中,group by ID, NAME, ROWNUM会把每条数据单独分组(因为每条数据的ROWNUM都唯一),所以count(*)的结果始终是1,无法得到符合条件的总条数。而且ROWNUM是查询过程中动态生成的伪列,不适合用于分组逻辑。

内容的提问来源于stack exchange,提问作者user2298581

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:32:18