2016-09-26 41 views
0

我知道這是一個重複問題,但其他帖子並未解決我的問題。如何在訂購後限制oracle查詢返回的行數?

我想只顯示從下面的查詢產生的前2行。

SELECT 
    AVG(sessionprice), 
    branchsuburb 
FROM branch, 
     sessions 
WHERE branch.branchid = sessions.branchid 
GROUP BY branchsuburb 
ORDER BY AVG(sessionprice) DESC; 

該查詢的是將返回所有的結果,但我想它限制只有前2(無論在哪個行具有最高的平均)。我嘗試在這篇文章中獲取函數 How do I limit the number of rows returned by an Oracle query after ordering? 但是它只是返回一個ORA-00933錯誤。我知道我一定犯了一些愚蠢的錯誤,但我無法弄清楚。有沒有辦法做到這一點,而不使用子查詢?

添加取功能後的代碼看起來像這樣

SELECT 
    AVG(SESSIONPRICE), 
    BRANCHSUBURB 
FROM BRANCH, 
     SESSIONS 
WHERE BRANCH.BRANCHID = SESSIONS.BRANCHID 
GROUP BY BRANCHSUBURB 
ORDER BY AVG(SESSIONPRICE) DESC 
FETCH FIRST 2 ROWS ONLY; 
+2

哪個Oracle版本? – Aleksej

+0

SQL Developer 4.1.5 –

+0

Oracle版本,而不是客戶端版本 – Aleksej

回答

4

FETCH在甲骨文最近推出的。在較早的版本中,您需要使用子查詢:

SELECT bs.* 
FROM (SELECT avg(sessionprice), branchsuburb 
     FROM branch b JOIN 
      sessions s 
      ON b.branchid = s.branchid 
     GROUP BY branchsuburb 
     ORDER BY avg(sessionprice) DESC 
    ) bs 
WHERE rownum <= 2; 
+0

感謝您的幫助。沒有子查詢有沒有辦法做到這一點? –

+1

@Hayden null:不。你可以將它移動到xing所示的cte中,但它仍然是子查詢。或者你可以切換到Oracle 12c。 –

1

您可以使用CTE並實現此目的;

with tbl as (SELECT avg(sessionprice), branchsuburb 
       FROM branch b JOIN 
        sessions s 
        ON b.branchid = s.branchid 
       GROUP BY branchsuburb 
       ORDER BY avg(sessionprice) DESC) 
select tbl.* from tbl 
WHERE rownum <= 2; 
+1

非常感謝。這非常有幫助。 –

0

Yon可以試試這個。這是分頁也開始和結束位置

SELECT * FROM (SELECT inner_query.*, rownum rnum FROM (SELECT * FROM table_name ORDER BY column_name) inner_query WHERE rownum <= 20) WHERE rnum >= 1; 

ROWNUM沒有記錄和RNUM是起始位置。

0
select * from (SELECT 
    AVG(SESSIONPRICE), 
    BRANCHSUBURB 
FROM BRANCH, 
     SESSIONS 
WHERE BRANCH.BRANCHID = SESSIONS.BRANCHID 
GROUP BY BRANCHSUBURB 
ORDER BY AVG(SESSIONPRICE) DESC) where ROWID <= 2