SQL三表关联视图GROUP BY必要性及分组字段疑问
关于创建SQL视图时GROUP BY的疑问解答
为什么需要GROUP BY?
你用到了STRING_AGG()这个聚合函数,它的作用是把同一分组内的多个字符串值拼接成一个集合。在SQL语法规则里,只要SELECT语句中包含聚合函数,就必须搭配GROUP BY子句——用来指定按照哪些字段对数据进行分组,聚合函数会针对每个分组单独计算结果,而非对整个表全局计算。
如果省略GROUP BY,数据库无法确定要将哪些行的descrip和sub_descrip进行拼接,会直接抛出语法错误。
为什么要将another_id、amount纳入GROUP BY?
这要结合SQL语法规则和你的表结构来解释:
- SQL语法强制要求:标准SQL规定,SELECT列表中出现的非聚合字段(即没有被聚合函数包裹的字段,比如这里的
t1.key_id、t2.another_id、t2.amount),必须全部出现在GROUP BY子句中。数据库需要明确这些字段是分组的依据,否则无法确定每个分组对应的这些字段值。 - 表结构保证分组粒度不变:根据你给出的表结构,
table_2的主键是key_id,这意味着每个key_id对应唯一的another_id和amount。所以将这两个字段加入GROUP BY,并不会改变分组的最终粒度——每个分组仍然对应唯一的key_id,不会出现一个key_id被拆分成多个分组的情况。
补充:原SQL的语法修正
你提供的SQL语句中,两个STRING_AGG()之间缺少逗号,会导致语法错误,同时因为table_3的amount_mod依赖于another_id(每个another_id对应唯一的amount_mod),严格遵循标准SQL的话也需要将其加入GROUP BY,修正后的语句如下:
CREATE VIEW combined_view AS SELECT t1.key_id, t2.another_id, t2.amount, t3.amount_mod, STRING_AGG(t1.descrip, ', ') AS descrips, STRING_AGG(t1.sub_descrip, ', ') AS sub_descrips FROM table_1 t1 JOIN table_2 t2 ON t1.key_id = t2.key_id JOIN table_3 t3 ON t3.another_id = t2.another_id GROUP BY t1.key_id, t2.another_id, t2.amount, t3.amount_mod;
内容的提问来源于stack exchange,提问作者u2j4
相关产品推荐
相关产品推荐

