不存在带的SQL双重否定

不存在带的SQL双重否定,sql,logic,Sql,Logic,我有一个嵌套的不存在,并且想知道它是否是双重否定。如果我去掉这两个否定,它是否是等价的查询 Suppliers(sid: integer, sname: string, address: string) Parts(pid: integer, pname: string, color: string) Catalog(sid: integer, pid: integer, cost: real) SQL翻译:“不存在不由C.Sid提供的部件的C.Sid” 删除否定:“C.Sid谁提供每个零件”

我有一个嵌套的不存在,并且想知道它是否是双重否定。如果我去掉这两个否定,它是否是等价的查询

Suppliers(sid: integer, sname: string, address: string)
Parts(pid: integer, pname: string, color: string)
Catalog(sid: integer, pid: integer, cost: real)
SQL翻译:“不存在不由C.Sid提供的部件的C.Sid”

删除否定:“C.Sid谁提供每个零件”


第二个查询是
C.Sid
,它提供目录中的零件


查询中没有“全部”的含义。这两个问题完全不同。

不确定你的问题是否只是教育性的,还是你在寻求更好的解决问题的方法

如果您知道每个供应商销售多少零件,并且知道有多少零件。比较这些值很容易

SELECT C.Sid
FROM Catalog C
GROUP BY C.Sid
HAVING COUNT(pid) = (SELECT COUNT(P.pid)
                     FROM Parts P)

不,这些操作是不同的。您试图实现的功能相当于SQL中的

下面是一个示例,您可以在其中测试以下查询:

第一个:

SELECT * FROM Catalog C
WHERE NOT EXISTS (SELECT P.pid FROM Part P
                  WHERE NOT EXISTS (SELECT C1.sid FROM Catalog C1
                                    WHERE C1.sid = C.sid
                                    AND C1.pid = P.pid) );

sid pid
1   1
1   2
2   1
2   2
替代方案(您可以看到结果现在是等效的):

和一个经典的数据库课程练习:

-- Suppliers for which doesn't exists any part that they doesn't provide.
SELECT * FROM supplier S
WHERE NOT EXISTS ( SELECT * FROM part P
                   WHERE NOT EXISTS ( SELECT * FROM catalog C
                                      WHERE S.sid = C.sid
                                        AND P.pid = C.pid ) );

sid name
1   "Dath Vader"
2   "Han Solo"
剖析上述查询的一部分可能会让您更好地了解查询中涉及的逻辑

SELECT * FROM part P
WHERE NOT EXISTS ( SELECT * FROM catalog C
                   WHERE P.pid = C.pid
                     AND C.sid = 3); -- R2D2 Here!

pid name
2   "Laser Gun"
R2D2被排除在结果集中,因为它是唯一销售未在零件表中列出的产品的产品。
此行的存在将RD2D从最终结果集中排除。

这将不起作用,您处理的不是“每个部分”,而是“存在一个部分”
SELECT * FROM Catalog C
WHERE EXISTS (SELECT P.pid FROM Part p
              WHERE EXISTS (SELECT C1.sid FROM Catalog C1
                            WHERE C1.sid = C.sid
                              AND C1.pid = P.pid) );

sid pid
1   1
1   2
2   1
2   2
3   1
3   3
-- Suppliers for which doesn't exists any part that they doesn't provide.
SELECT * FROM supplier S
WHERE NOT EXISTS ( SELECT * FROM part P
                   WHERE NOT EXISTS ( SELECT * FROM catalog C
                                      WHERE S.sid = C.sid
                                        AND P.pid = C.pid ) );

sid name
1   "Dath Vader"
2   "Han Solo"
SELECT * FROM part P
WHERE NOT EXISTS ( SELECT * FROM catalog C
                   WHERE P.pid = C.pid
                     AND C.sid = 3); -- R2D2 Here!

pid name
2   "Laser Gun"