簡體   English   中英

如何使用Oracle使用相同的SQL查詢獲得總結果計數和給定的子集(結果的“頁面”)

[英]How can I get the total result count, and a given subset ('page' of results) with the same SQL Query with Oracle

我想顯示一個結果表。 數據來自Oracle數據庫上的SQL查詢。 我想一次顯示一頁結果(例如10條記錄),以最大程度地減少發送到前端的實際數據。

同時,我想顯示可能的結果總數(例如,顯示123中的1-10),並允許分頁(例如,計算每頁10個結果,即123個結果,因此為13頁)。

我可以通過一次count查詢獲得結果count

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

我可以通過另一個查詢獲得所需的子集

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

但是,是否有一種方法可以在一個查詢中獲取所有相關詳細信息?

更新實際上,以上使用ROWNUM查詢似乎適用於0-10,但不適用於10-20,那么我也該怎么做?

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正確獲得order by 如果您將訂單提高一級

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

它將選擇3個random(*)行並對它們進行排序,但這通常不是您想要的。

(*)並非真正隨機,但可能不是您期望的。

有關實現分頁的更有效方法,請參見http://use-the-index-luke.com/sql/partial-results/window-functions

您可以在表上使用內部聯接,並在子查詢中獲取結果總數。 查詢示例如下:

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;

不確定基於問題的措辭要做什么,但是似乎您想查看包含所有記錄的專門表,其中行號介於兩個值之間,並且在每個記錄的相鄰字段中查看記錄的總數。 如果是這樣,您可以嘗試說出表中的所有內容,並通過說出1 = 1(即,到處都是)將該字段添加到記錄中,將COUNT值的子查詢作為字段加入。 例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM