在包含Group By的Query中左连接

时间:2013-05-14 17:41:05

标签: sql group-by left-join

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

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 

它会返回预期的结果,但当我将JOIN替换为LEFT JOIN时,它仍会提供相同的结果。它不会返回LEFT JOIN规定的Customer表的所有行。为什么LEFT JOIN的功能在这个场合受到限制?由于有人无法区分来自匹配的结果和仅出现在左表中的结果?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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