SQL:使用嵌套查询不存在

时间:2013-02-27 23:01:15

标签: sql exists except

我无法理解此查询有效。假设返回已订购所有商品的客户的名称。

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吗? 。我不确定如何得到我的最终结果。谢谢你的帮助。

2 个答案:

答案 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就存在任何此类项目。

因此,整个查询会查找订购了每个项目的客户的名称。