如何使用与Oracle相同的SQL查询获取总结果计数和给定子集('结果页面)

时间:2017-04-04 16:00:04

标签: sql oracle pagination

我想显示一个结果表。数据来自Oracle数据库上的SQL查询。我想一次显示一页(例如,10条记录)的结果,最小化发送到前端的实际数据。

同时,我想显示可能结果的总数(例如,显示123的1-10),并允许分页(例如,计算每页10个,结果123个,因此13页)。

我可以通过一次count查询获得结果总数。

SELECT count(*) AS NUM_RESULTS FROM ... etc.

我可以用另一个查询获得所需的子集

SELECT * FROM ... etc. WHERE ? <= ROWNUM AND ROWNUM < ?

但是,有没有办法在一个查询中获取所有相关细节?

更新 实际上,使用ROWNUM的上述查询似乎适用于0 - 10,但不适用于10 - 20,那么我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

ROWNUM使用起来有点棘手。 对于实际获取的第一个结果,ROWNUM伪列始终以1开头。如果您过滤ROWNUM&gt; 10,您将永远不会获取任何结果,因此不会得到任何结果。

如果你想用它进行分页(不是你真的应该),它需要嵌套的子查询:

select * from 
   (select rownum n, x.* from 
     (select * from mytable order by name) x
   )
   where n between 3 and 5;

请注意,您需要另一个嵌套子查询才能获得order by权限;如果你把订单提高一级

select * from 
   (select rownum n, x.* from mytable x order by name)
   where n between 3 and 5;

它将选择3个随机(*)行并对它们进行排序,但这通常不是你想要的。

(*)不是随意的,但可能不是你所期望的。

有关实施分页的更有效方法,请参阅http://use-the-index-luke.com/sql/partial-results/window-functions

答案 1 :(得分:0)

您可以在表上使用内部联接并获取子查询中的结果总数。查询示例如下:

SELECT E.emp_name, E.emp_age, E.emp_sal, E.emp_count
  FROM EMP as E 
 INNER JOIN (SELECT emp_name, COUNT(*) As emp_count
               FROM EMP GROUP BY emp_name) AS T
    ON E.emp_name = T.emp_name WHERE E.emp_age < 35;

答案 2 :(得分:0)

根据您的问题措辞,不确定您的确切信息,但似乎您希望查看所有记录的专用表,其中行号介于两个值之间,并且在每个记录的相邻字段中看到记录总数。如果是这样,您可以尝试从表中选择所有内容并将COUNT值的子查询作为字段加入,方法是说1 = 1(即无处不在)将该字段添加到记录中。例如:

SELECT *
FROM table_name LEFT JOIN (SELECT COUNT(*) AS NUM_RESULTS FROM table_name) ON 1=1
WHERE ? <= ROWNUM AND ROWNUM < ?