【发布时间】:2011-09-08 06:02:40
【问题描述】:
当我将 WHERE 子句添加到具有 COUNT(*) 的 LEFT JOIN 的查询时,有人可以帮我理解以下行为吗?
我有两张桌子:
TABLE 1: customers
customer_id | name
------------------
1 | Bob
2 | James
3 | Fred
TABLE 2: orders
order_id | customer_id | order_timestamp
----------------------------------------
1000 | 1 | 2011-01-01 00:00
1001 | 1 | 2011-01-05 00:00
1002 | 2 | 2011-01-10 00:00
现在下面的查询告诉我每个客户下了多少订单:
select c.customer_id, count(o.order_id)
from customers c
left join orders o using (customer_id)
group by 1
customer_id | count
-------------------
1 | 2
2 | 1
3 | 0
这很好用,但是如果我在查询中添加 WHERE 子句,即使我正在执行 LEFT JOIN,查询也不再为未下任何订单的客户输出零计数:
select c.customer_id, count(o.order_id)
from customers c
left join orders o using (customer_id)
where o.order_timestamp >= '2011-01-05'
group by 1
customer_id | count
-------------------
1 | 1
2 | 1
现在,如果我将 WHERE 条件作为 LEFT JOIN 的一部分移动,如下所示,对于未下订单的客户,我将获得零计数:
select c.customer_id, count(o.order_id)
from customers c
left join orders o on (c.customer_id = o.customer_id) and (o.order_timestamp >= '2011-01-05')
group by 1
我很困惑为什么第二个查询不起作用,但第三个却起作用?有人可以给我一个解释吗?也不确定这是否重要,但我正在使用 postgres。谢谢!
【问题讨论】:
标签: sql postgresql aggregate-functions