加入额外表时的东西?

时间:2018-10-12 11:32:01

标签: sql-server tsql sql-server-2012

请参阅下面的表TABLE

ID    FIELD_1
-------------
1     123
1     456
1     789
2     111

我想按ID列出所有FIELD_1,如下所示:

select [ID],
       stuff((
           select '; ' + [FIELD_1]
           from   [TABLE] t1
           where  t1.[ID] = t2.[ID]
           for    xml path ('')
       ),1,1, '') as [FIELDS]
from   [TABLE] t2

输出:

ID    FIELDS
------------
1     123; 456; 789
2     111

但是现在; ;每个FIELD_1在另一个表(TABLE2)中可以有多个条目:

FIELD_1    FIELD_2
------------------
123        A
123        B
456        B
111        C
111        X
111        Z

我需要将它们添加到我的输出中,如下所示:

ID    FIELDS
------------
1     123 (A, B); 456 (B); 789
2     111 (C, X, Z)

所以我通过如下方式尝试了此操作:

select [ID],
       stuff((
           select '; ' + [FIELD_1] + [FIELD_2]
           from   [TABLE] t1
           where  t1.[ID] = t2.[ID]
           for    xml path ('')
       ),1,1, '') as [FIELDS]
from   [TABLE] t2
left join [TABLE2] t3 on t2.[ID] = t3.[ID]

但这将为FIELD_1TABLE2的每次出现返回一行。

此查询的正确方法是什么?我是否需要在现有的STUFF()选择中使用STUFF()

1 个答案:

答案 0 :(得分:1)

declare @t2 table (id int)
    insert into @t2 values (1),(2)

declare @t1 table (id int, field_1 varchar(55))
    insert into @t1 values (1,'123'), (1,'456'),(1,'789'),(2,'111')

declare @t3 table (field_1 varchar(55), field_2 varchar(55))
    insert into @t3 values ('123','A'), ('123','B'),('456','B'),('111','C'),('111','X'),('111','Y')

select  [ID],
        stuff(( select '; ' + [FIELD_1]+ISNULL(' ('+[FIELDS_2]+')','')
                from(
                        select id, [FIELD_1],
                               stuff((
                                   select ',' + t3.[FIELD_2]
                                   from   @t3 t3 
                                   where  t3.[FIELD_1] = t1.[FIELD_1]
                                   for    xml path ('')
                               ),1,1, '') as [FIELDS_2]
                        from   @t1 t1
                         where  t1.[ID] = t2.[ID])t           for    xml path ('')
                               ),1,1, '') as [FIELDS]
from   @t2 t2