SQL按Name分组统计Number计数并关联t2表失败,求排查问题
SQL代码问题排查与修正
问题出在这几个地方
- 关键字冲突:
count是SQL的保留关键字,直接拿它当别名会触发语法错误,数据库分不清这是关键字还是你自定义的字段名。 - 没必要的子查询:
(select * from t2) as b纯属多余,直接关联t2表就行,不用多套一层子查询。 - 连接类型可能不符合需求:默认的
join是内连接,只会返回两张表Name匹配的行,如果要保留t2里所有记录(哪怕t1里没对应Name),得用left join。 - 计数逻辑要确认:
count(Number)会跳过Number为NULL的行,如果要统计每个Name的总记录数(包括Number为空的情况),得换成count(*)。
修正后的代码
-- 替换关键字别名,简化子查询,按需选连接类型 select * from ( select Name, count(Number) as count_num -- 把count换成count_num这类非关键字别名 from t1 group by Name ) as a left join t2 b -- 要只留匹配的记录就换回inner join on a.Name = b.Name;
也可以简化成更清爽的版本(去掉多余子查询):
select t2.*, count(t1.Number) as count_num from t2 left join t1 on t2.Name = t1.Name group by t2.Name, t2.其他列名; -- 注意:除了MySQL,其他数据库要求group by包含所有非聚合的选中列
额外提醒
- 如果用的是MySQL且开了
ONLY_FULL_GROUP_BY模式,第二个简化写法里group by必须包含t2表中所有你选中的非聚合列,不然会报错。 - 要是业务只需要两张表
Name匹配的记录,把left join改回inner join就好。
内容的提问来源于stack exchange,提问作者student_R123
相关产品推荐
相关产品推荐

