3

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

R是指客户下的商品订单表,其中包含客户 id (cid) 和商品 id (iid)

I指的是可以订购的项目表,其中包含项目 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 的底部嵌套查询获取任何客户订购的所有商品。

然后上面的嵌套查询 EXCEPT with SELECT I.iid,通过减去下面的查询来找到之前没有订购过的所有项目。

如果它是嵌套的,那么 NOT EXISTS 会评估什么语句?是因为 FROM Customer C 而导致的 R.cid = C.cid 吗?. 我不确定我将如何得到我的最终结果。谢谢你的帮助。

4

2 回答 2

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...

所以基本上,您正在寻找至少订购了所有东西的客户。

于 2013-02-27T23:14:10.240 回答
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)表示“客户从未订购过的所有商品的CID

NOT EXISTS (subquery)表达式内部,真正重要的是是否subquery返回任何行(在这种情况下它“存在”)。(SELECT I.iid FROM Item I) EXCEPT (SELECT R.iid FROM Order R WHERE R.cid=C.cid)如果有客户从未订购过的任何物品,C则存在 -如果没有任何此类物品,则不存在。

因此,整个查询会找到订购了每件商品的客户的姓名。

于 2013-02-27T23:16:44.913 回答