gpt4 book ai didi

数据库设计关系代数查询

转载 作者:搜寻专家 更新时间:2023-10-30 23:04:32 25 4
gpt4 key购买 nike

我有这个架构:

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 部分的目录条目(同样)。

您的推理并非完全错误,但这样做的方法不是使用不等式,而是使用外部联接并测试“外部”表上丢失的记录:

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)

关于数据库设计关系代数查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28327820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com