关系代数除了sql等价

时间:2015-11-20 06:35:59

标签: sql

我无法理解关系代数除法的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)
                  )

1 个答案:

答案 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?

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