我有这个架构:
Suppliers(sid: integer, sname: string, address: string)
Parts(pid: integer, pname: string, color: string)
Catalog(sid: integer, pid: integer, cost: real)
这项任务:
Find the sids of suppliers who supply every part.
我不明白为什么在这个解决方案中我们不会做出否定。我最终想要C1.pid <> P.pid
而不是C1.pid = P.pid
。有人可以解释一下吗?
SELECT C.sid
FROM Catalog C
WHERE NOT EXISTS (SELECT P.pid
FROM Parts P
WHERE NOT EXISTS (SELECT C1.sid
FROM Catalog C1
WHERE C1.sid = C.sid
AND C1.pid = P.pid))
答案 0 :(得分:2)
假设您有2个零件和1个供应商。供应商有两个部分。如果你加入<>
,你的最里面的子查询将返回两行:一行用于第一部分的目录条目(因为Part #1 <> Part #2
为真);第2部分的目录条目(同样)。
你的推理并非完全没有,但是这样做的方法不是使用不等式,而是使用外部联接并测试“外部”表上的缺失记录:
SELECT c.sid
FROM catalog c
WHERE NOT EXISTS
(SELECT c1.sid
FROM catalog c1 LEFT JOIN parts p ON c1.pid = p.pid
WHERE c.sid = c1.sid AND p.pid IS NULL)
就个人而言,我发现嵌套的not exists
有点令人困惑,而且不必要地复杂。我更有可能使用count
来解决这个问题:
SELECT c.sid
FROM catalog c
GROUP BY c.sid
HAVING COUNT (DISTINCT c.pid) = (SELECT COUNT (*) FROM parts)