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

