0

我有以下关系

Supplies            
sid     1       2       3       4
sname   Jason   David   John    Peter
address 1a      2b      3c      4d


Parts                       
pid     10      20      30      40      50
pname   Head    Body    Hand    Leg     Arm
color   red     blue    green   white   red


Catalog             
sid     1   1   2   2   3   4   1   1   4   4   1
pid     10  20  20  30  30  40  30  40  10  50  50
cost    100 200 150 150 130 125 50  180 123 126 120

我想选择供应每个红色或绿色部分的供应商的 sid。我认为这意味着it not exist that green or red parts that not supplied by him.

所以我做了以下查询,但它返回 null,我认为它应该返回 sid 为 1。

SELECT S.sid
FROM Suppliers S
WHERE NOT 
EXISTS (

SELECT P.pid
FROM Parts P
WHERE P.color = 'red' OR P.color = 'green'
AND NOT 
EXISTS (

SELECT C.pid
FROM Catalog C
WHERE C.pid = P.pid
AND C.sid = S.sid
)
)

我如何解决它?预先感谢。

4

2 回答 2

2

如果您想要提供红色和绿色零件的供应商,那么您可以使用类似于以下的查询:

select s.sid
from supplies s
inner join catalog c
  on s.sid = c.sid
inner join parts p
  on c.pid = p.pid
where p.color in ('red', 'green')
group by s.sid
having count(distinct p.color) = 2;

请参阅带有演示的 SQL Fiddle

或者@ypercube 指出的更好的方法:

select s.sid
from supplies s
left join catalog c
  on s.sid = c.sid
left join parts p
  on c.pid = p.pid
 and p.color in ('red', 'green')
group by s.sid
having count(distinct p.pid) = (select count(*)
                                from parts 
                                where color in ('red', 'green'));

请参阅带有演示的 SQL Fiddle

于 2013-05-08T23:04:23.340 回答
1

您的查询是正确的,除了OR导致错误结果的缺少括号(AND优先级高于OR)。它应该是:

WHERE (P.color = 'red' OR P.color = 'green')

或者:

WHERE P.color IN ('red', 'green')
于 2013-05-08T23:07:34.690 回答