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

Oracle分页同时获取行号与总记录数时totalcount返回1问题

问题原因
  • 笔误问题:你定义的CTE名称为cteEmp,但后续查询使用了不存在的CTEPO,若实际运行无报错,说明是你粘贴代码时写错了别名。
  • 核心逻辑错误:你在子查询中对c.empid、hr.empid做了分组操作,Count(*)统计的是每个分组内的行数,单员工维度的分组下统计结果自然永远为1,无法得到全局总记录数。
  • 逻辑冲突:分页行号生成逻辑和分组统计逻辑搭配混乱,没有必要针对员工ID分组。
修正后的SQL实现

如果你需要同时返回分页数据和全局总记录数,把分组统计改成窗口函数统计即可:

WITH cteEmp AS 
  (SELECT e.empid, e.empname, d.deptid, d.deptname
     FROM hr.Emp e
    INNER JOIN hr.dept d ON e.deptid = d.deptid)
SELECT * FROM (
    SELECT 
        row_number() OVER (ORDER BY eh.empid DESC) rn, 
        COUNT(*) OVER() totalcount, -- 窗口函数统计全量总记录数
        c.empName 
    FROM cteEmp c
    LEFT JOIN hr.emphistory eh ON c.empid = eh.empid
) t 
WHERE rn > 0 AND rn <= 100
修正说明
  • 用COUNT(*) OVER()窗口函数替代分组统计,空的OVER子句会统计整个结果集的总行数,返回的totalcount就是你需要的全局总记录数
  • 修复了CTE名称调用错误的问题,给关联表加了别名简化代码
  • 移除了不必要的GROUP BY子句,如果你需要去重可以在子查询中添加DISTINCT或调整关联逻辑,不要和总条数统计逻辑冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:39:02