把一对多的数据合并成一条

1、使用for xm path

select a.c_id,
(select [value] = stuff((select ','+max(checkcontent) from RiskControlEvaluateUnitRecordAnalysisRelationRequire detail where recordanalysisrelationid=a.c_id group by checkcontent for xml path('')), 1, 1, '')) troubleshootContent

FROM RiskControlEvaluateUnitRecordAnalysisRelation a with(nolock)

使用for xm path

select id,
(
select a.name from child_table a
inner join parent_table b on a.parentid=b.id
for xmlpath
)
troubleshootContent
FROM parent_table

再使用stuff函数优化

select id,
(
select [value] = stuff(
(
select ';'+a.name from child_table a
inner join parent_table b on a.parentid=b.id
for xml path('')
), 1, 1, ''
)
)
childname
FROM parent_table a

前后效果

 

 

2、使用for json PATH转为json数组

select id,
(
select a.name from child_table a
inner join parent_table b on a.parentid=b.id
for json path
) as childname
from parent_table

select b.id, a.name from child_table a
inner join parent_table b on a.parentid=b.id

效果

STUFF ( character_expression , start , length ,replaceWith_expression )
1.3 参数详解

1、character_expression

字符数据的表达式。character_expression 可以是常量、变量,也可以是字段或二进制字段。

2、start

start用来指定删除和插入开始位置的数值。 如果 start 值为负或为零,则返回空字符串。 如果 start 的长度大于第一个 character_expression,则返回空字符串。start 的类型也可以是 bigint。注意:start 值1 表示第一个字符。

3、length

length用来指定要删除的字符个数。 如果 length值 为负,则返回空字符串。 如果 length 的长度大于第一个 character_expression,则最多可以删除到最后一个 character_expression 中的最后一个字符。 如果 length 为零,则插入在 start 位置发生,并且不会删除任何字符。length 的类型也可以是 bigint。

4、replaceWith_expression

字符数据的表达式。character_expression 可以是常量、变量,也可以是字段或二进制字段。 此表达式从 start 开始替换 length 个字符的 character_expression。 如果 replaceWith_expression 为 NULL,则在不插入任何内容的情况下删除字符。


 

posted @ 2022-08-17 22:31  半、枫  阅读(65)  评论(0)    收藏  举报