2017-04-04 46 views
0

我想显示一个结果表。数据来自Oracle数据库上的SQL查询。我希望一次显示一页结果(比如10条记录),最大限度地减少发送到前端的实际数据。同时,我想显示可能结果的总数(例如,显示123的1-10),并且允许分页(例如,计算每页10个,123个结果,因此13页)。如何获得总结果数和给定子集('结果页')与Oracle相同的SQL查询

我可以通过单个count查询获得结果总数。

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

,我可以得到另一个查询

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

所需的子集,但,有没有办法让一个单一查询所有相关的细节?

更新 其实用ROWNUM上面的查询,似乎为0的工作 - 10,而不是10 - 20,所以我怎么能做到这一点?

回答

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; 
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 < ? 
1

ROWNUM使用起来有点棘手。 对于实际获取的第一个结果,ROWNUM伪列总是从1开始。如果你筛选ROWNUM> 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以获得更有效的分页方法。

+0

ROW_NUM()函数与ROWNUM有什么不同? – Vihung

+0

http://stackoverflow.com/questions/174595/in-an-oracle-database-what-is-the-difference-between-rownum-and-row-number –

相关问题