SQL多表关联替换分号分隔字段值及查询结果不全问题
解决SQL中分隔字段关联后合并结果的问题
需求与数据说明
需要编写SQL查询,从**表1(对应你的Supportcentral表)取出Id、Name、Categories字段,其中Categories列的分号分隔ID需替换为表2(对应你的Users表)**中对应的Firstname,lastname组合,多个值以空格分隔。
表结构与示例数据
表1(Supportcentral)
| ID | Name | Categories |
|---|---|---|
| 1 | Programmer | 1;2 |
| 2 | Analyst | 3;2 |
表2(Users)
| id | Firstname | lastname |
|---|---|---|
| 1 | john | kele |
| 2 | ajay | kashid |
| 3 | shubham | sharma |
期望结果
| Id | Name | Categories |
|---|---|---|
| 1 | Programmer | john,kele ajay,kashid |
| 2 | Analyst | shubham,sharma ajay,kashid |
现有问题分析
你当前的查询会把每个拆分出的ID对应结果单独返回一行,没有将同一记录的多个匹配结果合并成一个字符串,所以看起来只拿到了第一个匹配项。
解决方案
需要用字符串聚合逻辑,把拆分后关联得到的姓名组合合并成单个字段。根据你使用的SQL Server版本,提供两种实现方式:
方式1:用STRING_AGG(SQL Server 2017及以上版本)
SELECT sc.Id, sc.Name AS Application, STRING_AGG(CONCAT(u.Firstname, ',', u.lastname), ' ') AS coeowner FROM Supportcentral AS sc OUTER APPLY [dbo].[FN_split](sc.Categories, ';', 0) s LEFT JOIN Users u ON u.id = CAST(s.item AS INT) -- 注意字段类型匹配,原代码关联字段可能对应错误,按示例数据应关联id GROUP BY sc.Id, sc.Name
方式2:用FOR XML PATH(兼容低版本SQL Server)
SELECT sc.Id, sc.Name AS Application, STUFF( ( SELECT ' ' + CONCAT(u.Firstname, ',', u.lastname) FROM [dbo].[FN_split](sc.Categories, ';', 0) s LEFT JOIN Users u ON u.id = CAST(s.item AS INT) WHERE u.id IS NOT NULL -- 过滤无匹配的项 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS coeowner FROM Supportcentral AS sc
关键提示
- 原代码中用
u.u_Login关联s.item,但根据你的示例数据逻辑,应该用表2的id关联表1拆分后的Categories项,注意字段对应关系和类型转换(拆分后的item是字符串,要转成INT和表2的id匹配)。 STRING_AGG是高版本SQL Server的原生聚合函数,写法更简洁;低版本则用FOR XML PATH的方式拼接字符串。
内容的提问来源于stack exchange,提问作者Chundya
相关产品推荐
相关产品推荐

