SQL EXISTS returns 所有行,多于两个表

SQL EXISTS returns all rows, more than two tables

我知道以前有人问过类似的问题,但我还没有看到超过 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 的初学者,所以如果您能在必要时从根本上向我解释一下,我将不胜感激。谢谢。

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

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

我会将其视为两个聚合:

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;

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

编辑:

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

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

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

我建议你使用 "joins" ,

试试这个

select 数数(*) 从 订单o 内部联接 行项目 l 在 l.orderID = o.orderID 在哪里 l.quantity > 2