SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列



表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来

select * from tbl_diary_reback a left join tbl_diary_reback_files s on a.id =s.diaryrebackid where diaryid = '-7e0f6876:1400eb06d1f:-7fed' and diaryrebackid = '1a75114e:140136e5d5f:-7ff3'
由于子表是两条不同数据,会出现两条记录。如果这里想整合成一条记录,可以主表造两个虚拟列分别存图中的fileid字段,但是如果是未知个子表则无法知道需要创建多少个虚拟列(应该有DDL语法循环中创建列,在此不做研究)。


通过SQL SERVER带的OUTER APPLY方法可以构造出虚拟列

SELECT
							A.*, 
CAST(fileid AS varchar(4000)) fileid   

						FROM
							(   SELECT *      
							FROM
								tbl_diary_reback 
							where id = '1a75114e:140136e5d5f:-7ff3'
							)A      
						OUTER APPLY(       SELECT
							[fileid]= STUFF(REPLACE(REPLACE(         (          SELECT
								fileid FROM
									tbl_diary_reback_files N          
								WHERE
									diaryrebackid = A.id          FOR XML AUTO         ),
								'<N fileid="',
								','),
								'"/>',
								''),
								1,
								1,
								'')      )N 
红色字符位置必须保证一致,查询结果为


两条子表记录fileid通过","隔开 虚拟成一列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值