mysql - 选择属于一个主机的所有项目

标签 mysql sql

我有以下关系

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。 我认为这意味着不存在非他提供的绿色或红色部分。

所以我做了以下查询,但它返回 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
)
)

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

最佳答案

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

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

关于mysql - 选择属于一个主机的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451557/

相关文章:

c# - 使用 Linq 的多个外部连接与 2 个连接到同一个表/对象。得到了 SQL,需要 Linq to Entity

sql - TSQL函数比较两个字符串

mysql - 仅针对特定其他列值的一列的索引

mysql - 我可以通过 Azure 自动化中的 Runbook 将所有 Azure Active Directory 用户导出到 MySQL 数据库吗?

php mysql 查询 fatal error

mySQL更新表向列添加字符串

java - Hibernate 忽略了我的持续调用?

mysql - 使用条件列表的任何子集查询数据库

mysql - mongodb 到 sql 转换 1

sql - 如何有效地 SQL 从 MySQL 数据库中选择最新的条目?