我想显示一个结果表。数据来自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,那么我该怎么做呢?
答案 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 < ?