2015-02-11 66 views
2

嗨工作子查詢訂單的所有當我執行此查詢某種程度上它拋出下面的錯誤 -甲骨文沒有從DUAL

ORA-00907: missing right parenthesis

但是,如果您從SELECT 2 FROM DUAL order by 1刪除order by 1其工作。

難道我用1錯過這裏出來的東西或其ORACLE限制

SELECT (CASE 
     WHEN EXISTS 
       (SELECT 1 FROM DUAL) THEN 
       (SELECT 4 
       FROM dual) 
     ELSE 
       (SELECT 2 FROM DUAL order by 1) 
    END) AS DELEGATOR FROM dual 

下面是一個工作代碼以便從一行取出

SELECT (CASE 
     WHEN EXISTS 
       (SELECT 1 FROM DUAL) THEN 
       (SELECT 4 
       FROM dual) 
     ELSE 
       (SELECT 2 FROM DUAL) 
    END) AS DELEGATOR FROM dual 

回答

0

一個scalar subquery expression返回一個值。如果表達式返回多行,則會出現錯誤,「ORA-01427:單行子查詢返回多行」。由於它只能有一個單一的值,因此排序該值將毫無意義。

缺少右括號的錯誤並不一定意味着你有不平衡的圓括號,它可以表示其他錯誤,使得解析器在它期望看到的那一點放棄。在這裏解析器期望子查詢的右括號在FROM DUAL之後,所以當它沒有看到一個時停止 - 它不知道如何解釋語句的其餘部分,所以它不會嘗試(極大地簡化) 。

order by子句在子查詢中沒有意義,一般不允許;雖然它在一些地方是可以容忍的,如內聯視圖,儘管仍然沒有效果。

顯然你的例子是非常人爲的,但有一種情況你可能認爲你想要一個order by子句,那就是從你需要訂購的結果集中獲得第一個值。基於限制其他數據庫是如何工作的,你可以嘗試做這樣的事情:

select (
    select object_name from user_objects 
    where rownum = 1 
    order by created desc 
) 
from dual 

...但並不怎麼ROWNUM的作品,也將得到ORA-00907。如果這是你在做什麼,你需要(如現在內嵌視圖)子查詢的另一層可排序的,並且ROWNUM過濾器適用於:

select (
    select object_name from (
    select object_name from user_objects 
    order by created desc 
) 
    where rownum = 1 
) 
from dual 

...現在是有效的。

(你是否真的需要在子查詢中做這件事,而不是通過連接,是另一回事 - 你的查詢有希望足夠複雜以保證它)。

+0

謝謝你的回答。我正在重寫查詢。 – JuneDC 2015-02-12 02:47:51

+0

只是upvoted因爲我基於我的新查詢的最後一個查詢。謝謝。 – JuneDC 2015-02-12 02:59:54

0

選擇從2雙級數由1

首先,一個ORDER BY是沒有意義在這裏查詢返回只有一行。

其次,如果沒有排序行的感覺,則不能在Scalar Subquery Expression中使用order by。在某些情況下,外部查詢需要一組有序的行,則可以按順序排列。在你的情況下,沒有超過單排的問題。

第三,編碼爲order by 1,2等不是一個好的做法。而是使用適當的列名稱。您可能不會知道選擇列表中的列是否發生更改,您的結果集將按不同順序排列,您需要在兩個位置進行更改。

+0

第一條和第二條評論。這個查詢只是一個例子,所以它會返回多個行,這就是爲什麼我需要做一些命令。第三個不會回答這個問題,基本上結果只是一列,所以按1排序就足夠了。無論如何謝謝你的回答:) – JuneDC 2015-02-12 02:25:36

+0

在我的實際查詢中它將返回多行。 – JuneDC 2015-02-12 02:46:52

1

不知怎的,我已經放棄了,但當我將代碼更改爲這個 它以某種方式工作。我申請了我的實際查詢,結果 是預期的結果。

SELECT(CASE WHEN EXISTS (SELECT 1 FROM DUAL)THEN (SELECT 4 FROM雙) ELSE (SELECT * FROM(由1選擇2 FROM DUAL順序) 其中ROWNUM = 1) END )AS DELEGATOR FROM dual