2012-09-03 71 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