加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:41:00 所属栏目:MsSql教程 来源:网络整理
导读:有人可以帮助我理解当我向具有COUNT(*)LEFT JOIN的查询添加WHERE子句时发生的以下行为吗? 我有两张桌子: TABLE 1: customerscustomer_id | name------------------1 | Bob2 | James3 | FredTABLE 2: ordersorder_id | customer_id | order_timestamp-------
有人可以帮助我理解当我向具有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子句更改为o.order_timestamp为null或o.order_timestamp> =’2011-01-05′,那么您将获得与join子句限制相同的行为.

请注意 – 我会建议使用join子句方法,因为它与您尝试的方法更紧密地匹配.另外,我在上面提到的WHERE子句的更改只有在order_timestamp列不可为空时才有效 – 如果是,那么你应该使用不同的列进行空检查(例如,o.primarykey为null或o.order_timestamp&gt ; =’2011-01-05′).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读