我想从下表中获取订购了至少两种产品的客户。表格是:
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
的功能在这个场合受到限制?由于有人无法区分来自匹配的结果和仅出现在左表中的结果?
答案 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),看看你是否得到了预期的结果。