不存在带的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"