2012-09-03 98 views
1

chapstes和chapettesOracle:使用WHERE ROWNUM = 1

只是一個簡單的問題。我需要只從存儲過程返回一行,但無論我在哪裏放置WHERE子句,都會收到錯誤。有人可以看看(由於絕對長度而縮減的)代碼,並讓我知道它應該去哪裏,請嗎?

SELECT  **values** 

INTO   **variables**     

FROM   **table** 

_WHERE  ROWNUM = 1_ 

INNER JOIN **other table** 
ON   **join target** 
ORDER BY  **sort criteria**; 

_WHERE  ROWNUM = 1_ 

感謝

+0

包括你在哪裏放'rownum' – codingbiz

+0

WHERE嘗試現在包含在問題中,在_ – Skulmuk

回答

2

你幾乎是正確的。您將JOERE之後但在ORDER BY之前放置WHERE子句。

SELECT  **values** 

INTO   **variables**     

FROM   **table** 

INNER JOIN **other table** 
ON   **join target** 

_WHERE  ROWNUM = 1_ 

ORDER BY  **sort criteria**; 

但是,這不會做你可能會想到的 - ORDER BY是在where子句之後被評估的;這意味着這隻會選擇它找到的第一條記錄(它滿足連接條件),然後對該行進行排序(顯然這是無操作)。

其他答案(例如IvoTops')根據排序標準給出瞭如何獲取第一條記錄的想法。

6

我相信這是組織ROWNUM的方式查詢

SELECT * FROM 
INTO **Variables * * 
(SELECT * FROM X 
    WHERE Y 
    ORDER BY Z 
) 
WHERE ROWNUM = 1; 
+0

指定的行上如果我嘗試這個,它會抱怨我錯過了右括號。 – Skulmuk

+0

它在簡單的表格上以非常簡單的形式在數據庫中沒有錯誤地工作嗎? – IvoTops

+0

這是正確的方法,你一定錯過了某些東西才能得到那個錯誤。 –

1
SELECT  **values** 
INTO   **variables**     
FROM 
    (SELECT  **values** 
        , ROW_MUMBER() OVER (ORDER BY **sort criteria**) AS rn 
     FROM   **table** 
     INNER JOIN **other table** 
     ON   **join target** 
    ) tmp 
WHERE  rn = 1 ; 

檢查也這篇博客文章:Oracle: ROW_NUMBER() vs ROWNUM