【问题标题】:select all item that belong to one host选择属于一个主机的所有项目
【发布时间】:2013-05-09 08:11:34
【问题描述】:

我有以下关系

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
)
)

我该如何解决?提前致谢。

【问题讨论】:

标签: mysql sql


【解决方案1】:

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

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 with Demo

或者@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 with Demo

【讨论】:

  • 我认为连接应该是LEFT 连接和最后一个条件:having count(distinct p.pid) = (select count(*) from parts where color in ('red', 'green'))
  • @ypercube 也许我在你的评论中遗漏了一些东西,但这给出了错误的结果——sqlfiddle.com/#!2/31ef3/10
  • 是的,你是对的,我的意思是:fiddle-2
【解决方案2】:

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

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

或:

WHERE P.color IN ('red', 'green')

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2020-12-09
    • 2015-10-06
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多