【问题标题】:SQL EXISTS returns all rows, more than two tablesSQL EXISTS 返回所有行,多于两个表
【发布时间】:2017-02-24 05:47:06
【问题描述】:

我知道以前有人问过类似的问题,但我没有见过超过 2 张桌子的问题。而且好像有区别。

我有三个需要字段的表,customers 需要 customerIDorderIDorders 从中得到 customerIDorderIDlineitems orderIDquantity(= 订购数量)。

我想知道有多少顾客购买了超过 2 件相同的商品,所以基本上数量 > 2 有:

SELECT COUNT(DISTINCT custID) 
FROM customers
WHERE EXISTS(
    SELECT *
    FROM customers C, orders O, lineitems L
    WHERE C.custID = O.custID AND O.orderID = L.orderID AND L.quantity > 2
    );

我不明白为什么它会返回所有行的计数。我在检查 >2 条件之前关联子查询,不是吗?

我是 SQL 的初学者,如果有必要,如果您能从根本上向我解释一下,我将不胜感激。谢谢。

【问题讨论】:

    标签: sql subquery exists correlated-subquery


    【解决方案1】:

    您不必在EXISTS 子查询中重复customers 表。这就是关联的思想:使用外部查询的表来关联。

    SELECT COUNT(DISTINCT custID) 
    FROM customers c
    WHERE EXISTS(
        SELECT *
        FROM orders O
        JOIN lineitems L ON O.orderID = L.orderID
        WHERE C.custID = O.custID AND L.quantity > 2
        );
    

    【讨论】:

    • 那么这个错误是因为再次回头客造成的?或者使用JOIN 而不是FROM ... WHERE ... 在使用多个表时也会有所不同?
    • @sandboxj 是的,错误是由于再次使用表customers:它击败了相关性的想法。最好使用上面查询中的现代JOIN 语法,而不是使用逗号分隔表的旧式语法。
    【解决方案2】:

    我会将其视为两个聚合:

    select count(distinct customerid)
    from (select o.customerid, l.itemid, count(*) as cnt
          from lineitems li join
               orders o
               on o.orderID = l.orderId
          group by o.customerid, l.itemid
         ) ol
    where cnt >= 2;
    

    内部查询计算每个客户购买的商品数量。外部统计客户数量。

    编辑:

    我可能误解了上述答案的问题。如果你只想要quantity >= 2,那就简单多了:

    select count(distinct o.customerid)
    from lineitems li join
         orders o
         on o.orderID = l.orderId
    where l.quantity >= 2;
    

    这可能是表达查询的最简单方式。

    【讨论】:

      【解决方案3】:

      我建议你使用“joins”,

      试试这个

      选择 数数(*) 从 订单 内部联接 产品线 l 在 l.orderID = o.orderID 在哪里 l.数量 > 2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 2021-07-26
        • 2015-05-19
        相关资源
        最近更新 更多