在做项目提取需求的数据过程中,遇到一个这样的问题,相同的ID号,不同的value记录希望可以合并成一条记录,以‘/’隔开,并输出。

期望的结果如下图:

SQL解决方法一:
SELECT * FROM ( SELECT DISTINCT [id] FROM [test] )A
OUTER APPLY ( SELECT
[nameStr]= STUFF(REPLACE(REPLACE(
(
SELECT [name] FROM [test] N
WHERE [id] = A.id
FOR XML AUTO
), '', ''), 1, 1, '')
)M
运行结果如下:

代码分析:
1、CROSS APPLY 与 OUTER APPLY
使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
2、 FOR XML AUTO
将结果转换为XML结构
SQL解决方法二:

最后执行结果如下:

网友评论