SQL如何查询主表全量数据并将关联子表多行结果合并为单列展示
解法说明
当前环境为SQL Server,根据版本不同可以选择以下两种实现方案:
方案1:SQL Server 2017及以上版本(推荐)
直接使用内置的STRING_AGG聚合函数实现字符串拼接,语法简洁性能最优:
SELECT m.t_pdno, m.t_mitm, STRING_AGG(b.t_opno, ',') AS Options FROM main m LEFT JOIN branch b ON m.t_mitm = b.t_mitm GROUP BY m.t_pdno, m.t_mitm
- 逻辑说明:用
LEFT JOIN保留main表全部行,按main表的唯一键分组后,把同一个t_mitm对应的所有t_opno用逗号拼接,无匹配数据时Options列自动返回空值,完全符合预期输出。
方案2:SQL Server 2016及更低版本兼容方案
低版本没有STRING_AGG函数,可以用FOR XML PATH方式实现拼接:
SELECT m.t_pdno, m.t_mitm, STUFF(( SELECT ',' + CONVERT(VARCHAR(10), b.t_opno) FROM branch b WHERE b.t_mitm = m.t_mitm FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS Options FROM main m
- 逻辑说明:通过子查询拼接同一t_mitm下的所有t_opno,再用
STUFF去掉开头多余的逗号,同样可以得到预期结果。
内容的提问来源于stack exchange,提问作者Borislav Stefanov
相关产品推荐
相关产品推荐

