0

我想从下表中获取至少订购了两种产品的客户。这些表是:

Customer(Id, Name, City),
Product(Id, Name, Price),
Orders(Customer_Id, Product_Id, Date)

我使用查询

select c.*
from customer c
join orders o on o.customer_id = c.id
group by c.id
having count(o.customer_id) >= 2 

它返回预期的结果,但是当我用它替换JOINLEFT JOIN时仍然提供相同的结果。它不会按照规定返回 Customer 表的所有行LEFT JOIN。为什么LEFT JOIN在这种情况下功能受限?由于有人无法区分匹配结果与仅出现在左表中的结果吗?

4

2 回答 2

2

您的 LEFT JOIN 按预期工作,但您还有其他影响连接结果的事情。

特别是,您的 HAVING 子句仅接受在orders表 ( COUNT(o.customer_id) >= 2) 中有两个或多个匹配项的客户。当然,如果客户没有订单,它会被 LEFT JOIN 操作返回,但会被 HAVING 过滤掉——因为COUNT(o.customer_id)他们的评估结果为 0。

如果您想返回至少有两个订单的客户没有订单的客户,只需在查询中这样说,就像这样:

select c.*
from customer c
left join orders o on o.customer_id = c.id
group by c.id
having count(o.customer_id) >= 2
   or count(o.customer_id) = 0

甚至像这样:

select c.*
from customer c
left join orders o on o.customer_id = c.id
group by c.id
having count(o.customer_id) <> 1
于 2013-05-15T11:39:30.110 回答
0

在订单表中没有相应行的情况下,o.customer_id 为空。COUNT 只计算非空值。试试 COUNT(1) 或 COUNT(c.customer_id) 看看你是否得到了想要的结果。

于 2013-05-14T17:43:49.670 回答