SQL EXISTS返回所有行,超过两个表

时间:2016-10-14 17:48:12

标签: sql subquery exists correlated-subquery

我知道之前已经问过类似这样的问题,但是我没有看过超过2张表。似乎有所不同。

我有三个表格,我需要字段,customers我需要customerIDorderID来自orderscustomerIDorderID {1}}和lineitems我从中获得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的初学者,所以如果你能在必要时从根本上向我解释,我会感激不尽。感谢。

3 个答案:

答案 0 :(得分:2)

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

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
    );

答案 1 :(得分:1)

我会将其视为两个聚合:

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;

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

答案 2 :(得分:0)

我建议你使用“加入”,

试试这个

选择         计数(*)         从         订单o         内部联接         lineitems l         上         l.orderID = o.orderID         哪里         l.quantity> 2