gpt4 book ai didi

sql - 左连接和 count() 缺少行所需的解释

转载 作者:行者123 更新时间:2023-11-29 11:14:05 25 4
gpt4 key购买 nike

有人可以帮助我理解当我向具有带 COUNT(*) 的 LEFT JOIN 的查询添加 WHERE 子句时发生的以下行为吗?

我有两个表:

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。谢谢!

最佳答案

这是因为 NULL 不大于或等于任何东西;如果您将 WHERE 子句更改为 where o.order_timestamp is null or o.order_timestamp >= '2011-01-05' 那么您将获得与连接子句限制相同的行为。

但请注意 - 我会推荐连接子句方法,因为它更符合您尝试做的事情。此外,我上面提到的对 WHERE 子句的更改仅在 order_timestamp 列不可为空时才有效——如果可以,那么您应该使用不同的列进行空检查(例如,where o.primarykey is null or o .order_timestamp >= '2011-01-05').

关于sql - 左连接和 count() 缺少行所需的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com