【问题标题】:Get total count of rows in pagination query获取分页查询中的总行数
【发布时间】:2013-10-23 02:52:37
【问题描述】:

我有以下查询记录分页

SELECT *
  FROM (SELECT e.*, 
               ROWNUM row_num
          FROM (SELECT emp_no,
                       emp_name,
                       dob 
                  from emp) outr
          WHERE ROWNUM < ( (pagenum * row_size) + 1))
 WHERE  row_num >= ( ( (pagenum  - 1) * row_size) + 1)

我也想在同一个查询中获取行数,为此我已经尝试过 使用

COUNT(*) OVER ()

但是,当我分页到下一组页面和行时,我没有得到准确的结果。

如何有效地使用COUNT(*) OVER ()

【问题讨论】:

  • 请提供数据样本和所需输出。
  • 您应该将 COUNT(*) 放在最里面的查询中:SELECT emp_no, emp_name, dob, COUNT(*) FROM emp。当然,这样每次获取下一页的记录时,您都必须计算所有行。我想您不想一次获取行数?
  • @PrzemyslawKruglej 您能否解释一下我想您不想一次获取行数的确切含义?
  • 我的意思是先获取行数,不要再这样做了——保留值。当然,这样你可能无法在用户浏览结果页面时显示一些可以添加的记录,但是如果你从中获取数据的表很大,那么每次计算记录可能会影响性能。
  • @PrzemyslawKruglej 是的,现在我明白了。谢谢。所以如果表很大,count(*) over () 会对性能产生影响,不是吗?那么最好的解决方案是在两个单独的查询中执行?

标签: sql oracle pagination oracle10g


【解决方案1】:

具有总行数的典型分页查询是:

SELECT *
  FROM (SELECT outr.*,
               ROWNUM row_num
          FROM (SELECT emp_no,
                       emp_name,
                       dob,
                       count(*) over () total_nb
                  FROM emp
                 ORDER BY ...) outr
         WHERE ROWNUM < ((pagenum * row_size) + 1))
 WHERE row_num >= (((pagenum - 1) * row_size) + 1)

别忘了ORDER BY

【讨论】:

  • Vincent,使用count(*) over () 对性能有影响吗?
  • 与什么比较?与没有总数相比,当然:您要求 Oracle 检索计数,因此它基本上必须获取所有行。与其他方法相比?好吧,在大多数情况下,这可能会很好地执行,我想这取决于其他方法。
  • 我曾经有两个不同的 sql 查询,一个用于获取记录,另一个用于计算行数。所以我想使用一个查询来获取所有记录和行数。
  • 在大多数情况下,运行一个查询应该优于运行两个独立查询,但不会好很多,因为工作量大致相同。
  • 这应该被测试,因为我尝试了第二个查询只是为了计数与这个并且运行两个单独的查询运行得更快。试试看吧。
猜你喜欢
  • 1970-01-01
  • 2020-07-24
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
相关资源
最近更新 更多