2012-10-05 38 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