2017-04-04 47 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 –

相關問題