数据库设计关系代数查询
Database Design Relational Algebra query
我有这个架构:
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))
假设您有 2 个零件和 1 个供应商。供应商有两个部分。如果您在 <>
上加入,您最里面的子查询将返回两行:一个用于第 1 部分的目录条目(因为 Part #1 <> Part #2
为真);和一个用于第 2 部分的目录条目(同样)。
您的推理并不完全正确,但这样做的方法不是使用不等式,而是使用外部连接并测试 "outer" [=24= 上丢失的记录]:
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)
我有这个架构:
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))
假设您有 2 个零件和 1 个供应商。供应商有两个部分。如果您在 <>
上加入,您最里面的子查询将返回两行:一个用于第 1 部分的目录条目(因为 Part #1 <> Part #2
为真);和一个用于第 2 部分的目录条目(同样)。
您的推理并不完全正确,但这样做的方法不是使用不等式,而是使用外部连接并测试 "outer" [=24= 上丢失的记录]:
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)