我无法理解关系代数除法的sql等价的翻译。我正在努力找到供应各个部分的供应商的sids。在嵌套查询中,它基本上表明它正在寻找所有不提供每个部分的供应商。并且不存在?
但是,条件WHERE C1.sid = C.sid AND C1.pid = P.pid)
是否也针对实际供应每个部分的供应商的sid?
Suppliers(sid: integer, sname: string, address: string)
Parts(pid: integer, pname: string, color: string)
Catalog(sid: integer, pid: integer, cost: real)
SQL翻译
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)
在直接回答您的问题之前,让我带您了解如何翻译查询。让我们首先看一下外部子查询:
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)
此代码段获取了C.sid"未提供的部分。请注意,子查询中select子句中的列实际上没有任何意义。我们基本上可以像下面这样编写查询,但仍然传达完全相同的含义,因此您不必担心C1.sid
在最内层查询中的含义。
SELECT P.pid
FROM Parts P
WHERE NOT EXISTS (
SELECT *
FROM Catalog C1
WHERE C1.sid = C.sid
AND C1.pid = P.pid)
现在涉及主查询
SELECT C.sid
FROM Catalog C
WHERE NOT EXISTS (SELECT *
FROM Parts P
WHERE NOT EXISTS (SELECT *
FROM Catalog C1
WHERE C1.sid = C.sid
AND C1.pid = P.pid)
)
这意味着我们想要的是不存在的供应商(C.sid)"他们没有提供的部件(C.sid)" (注意我复制了上面段落中子查询的翻译)。这实质上意味着我们希望供应商提供各个部分。
现在回到你的两个问题:
在嵌套查询中,它基本上表明它正在寻找" for 所有供应商不提供每个部分"并且不存在?
没有。请看上面的解释。
但是条件不是C1.sid = C.sid和C1.pid = P.pid 还针对实际供应每个部分的供应商的sid?
查看与主查询相关的最内层查询不是正确的方法。这个最里面的查询是为第一个子查询选择我们想要的部分。此处选择的供应商与上面的*替换所示不相关。