数据库设计关系代数查询

时间:2015-02-04 17:39:23

标签: database relational

我有这个架构:

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

1 个答案:

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