2011-11-09 77 views
0

在Exeuting以下查詢:SQL查詢錯誤在甲骨文

SELECT ID 
    FROM INSTITUTE 
WHERE MEMBER_ID IN (
    SELECT ID 
     FROM MEMBER 
    WHERE ID IN (765,769,753,774,778,779,781,790,799,809, 
        820,823,855,835,839,842,845,849,850,851) 
    ORDER BY NAME ASC 
) 

我收到以下錯誤:

ORA-00907: missing right parenthesis 
00907. 00000 - "missing right parenthesis" 
*Cause:  
*Action: 
Error at Line: 5 Column: 81 

我該如何解決這個錯誤???

+2

你爲什麼築巢這麼多的子查詢?問題是第二個子選擇中的ORDER BY。 – diagonalbatman

回答

3

您的ORDER BY位於您的子查詢中,因此對結果的最終順序無用,但會導致您的錯誤。

將它移到子選擇之外。

SELECT id 
    FROM institute 
WHERE member_id IN 
      ( SELECT id 
       FROM MEMBER 
       WHERE id IN (765, 769, 753, 774, 778, 779, 781, 790, 
          799, 809, 820, 823, 855, 835, 839, 842, 
          845, 849, 850, 851) 
     ) 
ORDER BY name ASC 

N.B:我只能假設,nameinstitute表中的列否則ORDER BY將是完全多餘的。因此它應該訂購主要的SELECT

,或者完全刪除它...

SELECT id 
    FROM institute 
WHERE member_id IN 
      ( SELECT id 
       FROM MEMBER 
       WHERE id IN (765, 769, 753, 774, 778, 779, 781, 790, 
          799, 809, 820, 823, 855, 835, 839, 842, 
          845, 849, 850, 851) 
     ) 

這是不是查詢更有效率,但?

SELECT i.id 
    FROM institute i 
INNER JOIN member m 
    ON (i.member_id = m.id) 
WHERE m.id IN (765, 769, 753, 774, 778, 779, 781, 790, 
       799, 809, 820, 823, 855, 835, 839, 842, 
       845, 849, 850, 851) 
+1

您現在通過institute.name(如果存在)訂購結果,並且我確信OP希望通過member.name獲得結果順序。爲什麼不在'institute.member_id = member.id'上做一個連接並完全刪除子選擇? –

+0

@KlausByskovHoffmann有可能 - 然而,OP從未說明他們的預期用途/輸出,所以這將是一個猜測。但我同意這是合乎邏輯的。 – diagonalbatman

+1

在嘗試第二次猜測OP的表結構時,並不是所有的答案都是完美的,這只是他試圖達到的目標的近似值,同時消除了導致他們提出問題的問題。 – Ollie

0

ORDER BY應該BU推出IN子句的

SELECT ID 
FROM INSTITUTE 
WHERE MEMBER_ID IN (
SELECT ID FROM MEMBER WHERE ID IN (
765,769,753,774,778,779,781,790,799,809,820,823,855,835,839,842,845,849,850,851) 
) 
ORDER BY NAME ASC 
+1

這裏的每個人似乎都認爲該研究所有一個名稱列? –

+0

如果沒有,那麼這將是下一個錯誤信息 – bpgergo

0

試試這個 -

SELECT ID 
FROM INSTITUTE 
WHERE MEMBER_ID IN (
SELECT ID FROM MEMBER WHERE ID IN (765,769,753,774,778,779,781,790,799,809,820,823,855,835,839,842,845,849,850,851)) 
ORDER BY NAME ASC 

我懷疑你需要的IN條款之外ORDER BY聲明

+0

這裏的每個人似乎認爲該研究所有一個「名稱」列? –

0
SELECT ID FROM INSTITUTE 
WHERE MEMBER_ID IN (SELECT ID FROM MEMBER WHERE ID IN 
(765,769,753,774,778,779,781,790,799,809,820,823,855,835,839,842,845,849,850,851)) ORDER BY NAME ASC; 

試試這個 - 你的訂單是在錯誤的地方。

+2

這裏的每個人似乎都認爲該研究所有一個「名字」專欄? –

+1

我在寫答案時想到了這一點 - 但認爲說明ORDER BY子句應該在哪裏的最好方法是通過將「NAME」移到主查詢外面來進行說明。不過,我同意沒有支持這一決定的信息。 – diagonalbatman

0

這很可能是因爲您的ORDER BY子句出現在外部MEMBER_ID IN(...)子句內部。

這個查詢看上去非常彷彿它應該有一個JOIN而不是兩個IN()條款來完成:

SELECT INSTITUTE.id 
FROM 
    INSTITUTE JOIN MEMBER ON INSTITUTE.MEMBER_ID = MEMBER.ID 
WHERE MEMBER.ID IN IN (765,769,753,774,778,779,781,790,799,809,820,823,855,835,839,842,845,849,850,851) 
ORDER BY MEMBER.NAME ASC 
0

子查詢的order by是完全無用的,它不會爲了輸出的。刪除它,它會工作。

順便說一句,外移動也不會產生預期的結果,除了institute.name具有作爲member.name ;-)

1

ORDER BY在子選擇是沒用的值相同。考慮加入兩個表來代替,就像這樣:

SELECT ID 
FROM INSTITUTE i, MEMBER m 
WHERE 
i.MEMBER_ID = m.ID 
AND i.MEMBER_ID IN 
    (
     765,769,753,774,778,779,781,790,799,809,820,823,855,835,839,842,845,849,850,851 
    ) 
ORDER BY m.NAME