(Oracle)使用分页查询时如何获得结果总数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我正在使用Oracle 10g和下面的范例来获取15个结果的页面(这样当用户查看搜索结果的第2页时,他们会看到记录16-30)。

select * 
  from 
( select rownum rnum, a.*
    from (my_query) a
   where rownum <= 30 )
where rnum > 15;

现在我不得不运行一个单独的SQL语句在“my_query”上执行“select count”,以获得my_query的结果总数(以便我可以将其显示给用户并用它来计算出总页数等)。

有没有办法通过第二个查询获得结果的总数,即通过从上面查询获取结果?我已经尝试添加“max(rownum)”,但它似乎不工作(我得到一个错误[ORA-01747],似乎表明它不像我在组中有关键字rownum)。

我希望从原始查询中获得此信息而不是在单独的SQL语句中执行此操作的基本原理是“my_query”是一个昂贵的查询,所以我宁愿不运行它两次(一次获取计数,一次获取数据页)如果我不必; 但无论我能想出什么解决方案来获得单个查询中的结果数量(并且同时获得我需要的数据页面),如果可能的话,不应增加太多的额外开销。

这正是我想要做的,我收到了一个ORA-01747错误,因为我相信它不像我在组里有ROWNUM。请注意,如果有另一个解决方案不使用max(ROWNUM),但是其他方法,那也是非常好的。这个解决方案是我首先想到什么可能工作。

 SELECT * FROM (SELECT r.*, ROWNUM RNUM, max(ROWNUM)
 FROM (SELECT t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t0.LAST_NAME, t1.SCORE
 FROM ABC t0, XYZ t1
 WHERE (t0.XYZ_ID = 751) AND 
 t0.XYZ_ID = t1.XYZ_ID 
 ORDER BY t0.RANK ASC) r WHERE ROWNUM <= 30 GROUP BY r.*, ROWNUM) WHERE RNUM > 15

提问于
用户回答回答于

我认为你必须修改你的查询来达到这样的目的,以便在“单一”查询中获得你想要的所有信息。

SELECT *
FROM (SELECT r.*, ROWNUM RNUM, COUNT(*) OVER () RESULT_COUNT 
      FROM (SELECT t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t1.SCORE
            FROM ABC t0, XYZ t1
            WHERE (t0.XYZ_ID = 751) 
            AND t0.XYZ_ID = t1.XYZ_ID 
            ORDER BY t0.RANK ASC) R)
WHERE RNUM between 1 and 15 

原因在于COUNT(*) OVER()窗口函数在WHERE子句之后被评估,因此不给出记录的总数,而是给出满足ROWNUM <= 30条件的记录数。

用户回答回答于

这个有用吗?

select * 
  from 
( select rownum rnum, a.*, b.total
    from (my_query) a,   (select count(*) over () total from my_query) b
   where rownum <= 30 )
where rnum > 15;

扫码关注云+社区