我很难理解关系代数除法的sql等价物的翻译。我正在努力寻找供应每一个零件的供应商。在嵌套查询中,它本质上是在说它正在寻找"所有没有提供每一个零件的供应商",并且不存在吗?但是条件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)
)
在直接回答您的问题之前,让我向您介绍一下应该如何翻译查询。让我们先把外部子查询看作一个整体:
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)"(注:我从上面一段中复制了子查询的翻译)。这基本上意味着我们需要供应商来供应每一个零件。
现在回到你的两个问题:
在嵌套查询中,它本质上是在声明它正在查找"不提供每一个零件的所有供应商"并且不存在
没有。请参阅上面的解释。
但条件是C1.sid=C.sid AND C1.pid=p.pid)还针对实际供应每一个零件的供应商的sid?
查看与主查询相关的最内部查询不是正确的方法。这个最里面的查询用于第一个子查询,以选择我们想要的部分。此处选择的供应商不相关,如上面用*替代所示。