2012-10-05 39 views
0

我寫此查詢,但它給我一個錯誤:甲骨文的SQL * Plus EXCEPT ORA-00907:缺少右括號

select c.sid 
from catalog c 
where exists ((select p.color from parts p) 
except (select p2.color from parts p2 where p2.color != 'Red')); 

ORA-00907:缺少右括號

,你能告訴我在哪裏是不正確的?

目錄:

SID  PID  COST 

 1   3   .5 
    1   4   .5 
    1   8  11.7 
    2   3  .55 
    2   8  7.95 
    2   1  16.5 
    3   8  12.5 
    3   9   1 
    4   5  2.2 
    4   6 1247548.23 
    4   7 1247548.23 

部分:

PID PNAME        COLOR 

 1 Left Handed Bacon Stretcher Cover Red 
    2 Smoke Shifter End     Black 
    3 Acme Widget Washer     Red 
    4 Acme Widget Washer     Silver 
    5 I Brake for Crop Circles Sticker Translucent 
    6 Anti-Gravity Turbine Generator  Cyan 
    7 Anti-Gravity Turbine Generator  Magenta 
    8 Fire Hydrant Cap     Red 
    9 7 Segment Display     Green 
+1

對於初學者,您的EXISTS子句根本不連接到目錄表C.另外,EXCEPT在oracle中被稱爲MINUS。你可以請你發佈你的數據結構和一些示例數據,以及你想要這個查詢來完成什麼?您可以編輯您的答案以添加此信息。 –

+0

@NWest我添加了信息 ,我想知道只供應紅色部分的供應商sid –

回答

1

i want to know sid of suppliers who supply only red parts

你可以寫:

SELECT c.sid 
    FROM catalog c 
    JOIN parts p 
    ON p.pid = c.pid 
WHERE p.color = 'Red' 
MINUS 
SELECT c.sid 
    FROM catalog c 
    JOIN parts p 
    ON p.pid = c.pid 
WHERE p.color <> 'Red' 
; 

MINUS前面的部分找到所有誰供應紅色部分的供應商; MINUS之後的部分找到所有供應商-red部件;因此,整個查詢查找所有供應只有紅色部分的不同供應商。

+0

我以前不知道'<>',這使得它更容易 非常感謝你! –

+0

@ChrisPark:不客氣!爲了澄清,在Oracle中'!='和'<>'是等價的。我更喜歡使用'<>'因爲它是標準的SQL,但你可以使用任何你喜歡的。 – ruakh