关系代数除法sql等价



我很难理解关系代数除法的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?

查看与主查询相关的最内部查询不是正确的方法。这个最里面的查询用于第一个子查询,以选择我们想要的部分。此处选择的供应商不相关,如上面用*替代所示。

最新更新