使用STRING_AGG时报错“Cannot perform an aggregate function on an expression containing an aggregate or a subquery”的解决求助
STRING_AGG时报错“Cannot perform an aggregate function on an expression containing an aggregate or a subquery”的解决求助
嗨,我来帮你搞定这个报错问题!你遇到的这个错误,根源是STRING_AGG这类聚合函数里不能直接嵌套子查询,SQL引擎不允许这种写法。
你想要的效果是:返回主表所有列,同时把每个主表行关联的SupportTable ID拼成逗号分隔的字符串,哪怕没有关联ID也要返回空或者NULL对吧?给你两种靠谱的解决方案:
方案一:LEFT JOIN + GROUP BY
这种是比较常规的写法,用左连接关联两张表,然后通过GROUP BY来聚合每个主表行对应的ID:
SELECT PrimaryTable.*, STRING_AGG(SupportTable.Id, ',') AS AssociatedSupportTableIds FROM PrimaryTable LEFT JOIN SupportTable ON SupportTable.AssociatedPrimaryTableId = PrimaryTable.Id GROUP BY PrimaryTable.Id -- 如果你的主表有主键,只GROUP BY主键就够了(比如SQL Server、PostgreSQL都支持这种简化写法) -- 如果数据库不支持主键GROUP BY返回所有列,就把PrimaryTable的所有列都列在这里
注意:如果主表没有主键或者数据库不支持“GROUP BY主键返回所有列”的特性,你需要把PrimaryTable的每一列都写到GROUP BY里,虽然麻烦但能保证结果正确。
方案二:OUTER APPLY + 子查询聚合(更贴合你的需求)
如果你不想写一大堆GROUP BY的列,这个方案更合适!我们通过OUTER APPLY为每个主表行单独生成对应的ID字符串,完全不需要在主查询里GROUP BY:
SELECT PrimaryTable.*, COALESCE(aggregatedIds.Ids, '') AS AssociatedSupportTableIds FROM PrimaryTable OUTER APPLY ( -- 这里针对每个主表行,单独聚合关联的SupportTable ID SELECT STRING_AGG(SupportTable.Id, ',') AS Ids FROM SupportTable WHERE SupportTable.AssociatedPrimaryTableId = PrimaryTable.Id ) AS aggregatedIds
这里用COALESCE是为了把没有关联ID时的NULL转成空字符串,如果你保留NULL也可以去掉这个函数。
这个写法为什么能解决报错?因为我们把STRING_AGG的聚合逻辑放到了APPLY的子查询里,每个主表行对应一次独立的聚合,不再是在主查询的聚合函数里嵌套子查询,完美避开了SQL的限制~
备注:内容来源于stack exchange,提问作者Stanton
相关产品推荐
相关产品推荐

