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

2014-11-24 13:20:40 · 作者: · 浏览: 0
SQL SERVER中实现主表1行记录,子表多行记录整合成一条虚拟列
表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来
[sql] 
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方法可以构造出虚拟列
[sql] 
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 ), 'fileid="', ','), '"/>', ''), 1, 1, '') )N

红色字符位置必须保证一致,查询结果为
两条子表记录fileid通过","隔开 虚拟成一列