【问题标题】:SQL: Using Not Exists with Nested QuerySQL:在嵌套查询中使用 Not Exists
【发布时间】:2013-02-13 23:25:30
【问题描述】:

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

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

【问题讨论】:

  • 假设返回已订购所有商品的客户姓名。 是
  • 双重不存在的技巧在这里会起作用。
  • 你应该问这个问题而不说它应该做什么:)

标签: sql exists except


【解决方案1】:

打破它。从最里面的查询向后/开始:

这将返回客户订购的商品 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...

因此,基本上,您正在寻找至少订购了所有商品的客户。

【讨论】:

    【解决方案2】:

    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 有从未 订购过的任何物品 - 如果有不 则它不存在 em> 任何这样的项目。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 2019-03-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2021-03-02
      • 2019-01-12
      相关资源
      最近更新 更多