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
相关产品推荐
相关产品推荐

