我无法理解此查询有效。假设返回已订购所有商品的客户的名称。
R 是指客户订购的商品订单表,其中包含客户ID(cid)和商品ID(iid)
我是指可以订购的商品表,其中包含商品ID
C 是客户ID为
的客户表SELECT cname
FROM Customer C
WHERE NOT EXISTS
( (SELECT I.iid
FROM Item I)
EXCEPT
(SELECT R.iid
FROM Order R
WHERE R.cid=C.cid))
根据我的假设,使用SELECT R.iid的底部嵌套查询获取任何客户订购的所有商品。
然后使用SELECT I.iid在EXCEPT上方嵌套查询,通过使用下面的查询来查找之前尚未订购的所有项目。
如果它是嵌套的,那么NOT EXISTS评估的是什么语句?因为来自客户C,它是R.cid = C.cid吗? 。我不确定如何得到我的最终结果。谢谢你的帮助。
答案 0 :(得分:2)
分解。向后/使用最里面的查询:
这将返回客户订购的商品ID列表。 (我假设iid代表项目ID,并且是R中的fk)
SELECT R.iid FROM Order R WHERE R.cid=C.cid
这将返回一个项目ID列表(通常),除之外的那些已经由客户订购的
SELECT I.iid FROM Item I EXCEPT...
最后,这将返回一个客户列表,这些客户没有,没有订购列表中的一个项目。
SELECT cname FROM Customer C Where NOT EXISTS...
基本上,您正在寻找至少订购过所有产品的客户。
答案 1 :(得分:0)
SELECT I.iid FROM Item I
表示“所有项目的ID”。
SELECT R.iid FROM Order R WHERE R.cid=C.cid
表示“客户C
订购的所有商品的ID”(其中C
由包含的查询确定)。
通常,query1 EXCEPT query2
表示“query1
返回的所有行,query2
”返回的不。在您的具体情况下,(SELECT I.iid FROM Item I) EXCEPT (SELECT R.iid FROM Order R WHERE R.cid=C.cid)
表示“客户C
从未订购”的所有商品的ID。
在NOT EXISTS (subquery)
表达式中,真正重要的是subquery
是否返回任何行(在这种情况下它“存在”)。因此,如果有任何商品客户(SELECT I.iid FROM Item I) EXCEPT (SELECT R.iid FROM Order R WHERE R.cid=C.cid)
从未订购 - 并且不存在,那么C
就存在任何此类项目。
因此,整个查询会查找订购了每个项目的客户的名称。