用分隔符连接重复项

时间:2019-02-14 16:36:28

标签: sql-server

有几个示例将处理单个表的字符串连接在一起。就我而言,我要考虑两个表。

表A requestid int PK

表B requestid int 文档名称varchar(50)

表A requestid当然是唯一的,其中表B requestid可能有多行。表B可以包含与表A中的相同requestid的多个关系。另外,表A的某些requestid在表B中可能没有任何关联的记录。

我需要提取并加入两个表。表A包含约30万行,表B包含约14万行。请参阅下面的数据以说明我需要实现的目标。

表A样本

requestid FieldA FieldB FieldC  
1         33     44     22  
2         15     23     73  
3         26     73     34

表B样本

requestid documentname  
1          firstdoc.doc  
1          seconddoc.doc  
1          thirddoc.doc  
3          onedoc.doc  
3          lastdoc.doc

预期结果:

requestid FieldA FieldB FieldC documentname
 1         33     44     22     firstdoc.doc, seconddoc.doc, thirddoc.doc
 2         15     23     73     NULL
 3         26     73     24     onedoc.doc, lastdoc.doc

在我的解决方案中,非常重要的一点是,没有相关文档的requestid仍然存在于结果中。

希望我的问题很清楚,谢谢。

1 个答案:

答案 0 :(得分:0)

使用stuff可以轻松完成此操作
参见下面的示例

declare @tableA table (requestid int, fieldA int, fieldB int, fieldC int)
declare @tableB table (requestid int, documentname varchar(50))

insert into @tableA values (1, 33, 44, 22), (2, 15, 23, 73), (3, 26, 73, 34)
insert into @tableB values (1, 'firstdoc.doc'), (1, 'seconddoc.doc'), (1, 'thirddoc.doc'), (3, 'onedoc.doc'), (3, 'lastdoc.doc')

select a.requestid, a.fieldA, a.fieldB, a.fieldC,
       stuff(( ( select ',' + b.documentname
                 from   @tableB b
                 where  b.requestid = a.requestid
                 order by 1
                 For XML PATH (''))
              ), 1, 1, '') as docname
from   @tableA a

结果是

requestid   fieldA  fieldB  fieldC  docname 
---------   ------  ------  ------  --------    
1           33      44      22      firstdoc.doc,seconddoc.doc,thirddoc.doc 
2           15      23      73      
3           26      73      34      lastdoc.doc,onedoc.doc