关联两表分组查询:无重复列对应其他列需加入GROUP BY或用聚合函数?
解决GROUP BY关联查询时的额外列报错问题
嘿,这个场景我太熟悉了!你现在是关联两张表(就拿表A和表B举例吧),想按表A里完全无重复的列(比如A.id,每个id对应A表唯一一行,但能关联到B表的多行数据)分组,同时还要查A表的其他列(比如A.x、A.y),结果触发了类似这样的报错:
额外列(A.x, A.y)必须在GROUP BY子句中列出,或用聚合函数(如max)包裹。
为啥会蹦出这个报错?
这是因为SQL的严格模式(比如MySQL里的ONLY_FULL_GROUP_BY)有个死规矩:GROUP BY里的列必须覆盖所有没用到聚合函数的查询列。它可不知道你用来分组的A.id在A表里是唯一的,只会严格执行校验规则,所以就报错了。
两种可行解法(结果完全一模一样)
既然A.id是无重复的(每个id对应A表独一行),那下面两种写法效果完全一致,随便选哪种都可以:
把所有A表的列都塞进GROUP BY里
这种写法完全符合SQL标准,绝对不会触发报错:SELECT A.id, A.x, A.y, COUNT(B.id) as b_count FROM A LEFT JOIN B ON A.id = B.a_id GROUP BY A.id, A.x, A.y;因为
A.id是唯一的,每个分组里A.x和A.y的值也只会有一个,分组后根本不会改变结果,只是多写了几列而已。用聚合函数把A表的其他列包起来
你可以用MAX()、MIN()这类聚合函数,反正每个分组里A.x和A.y只有唯一值,聚合完还是它本身:SELECT A.id, MAX(A.x) as x, MAX(A.y) as y, COUNT(B.id) as b_count FROM A LEFT JOIN B ON A.id = B.a_id GROUP BY A.id;这种写法更清爽,尤其是当A表的非分组列特别多的时候,能少写好多代码。
为啥两种写法结果完全一致?
核心原因就是你用来分组的A.id在A表里是完全无重复的唯一值——每个分组对应的A表数据只有一行,不管是把这些列加入GROUP BY,还是用聚合函数去“提取”,拿到的都是这唯一的一行数据,结果自然完全相同。
内容的提问来源于stack exchange,提问作者benjimin
相关产品推荐
相关产品推荐

