вещи в материале при присоединении к дополнительному столу? - PullRequest
0 голосов
/ 12 октября 2018

См. Таблицу TABLE ниже:

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

Я хотел бы перечислить все FIELD_1 с для каждого ID следующим образом:

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_1 в TABLE2.

Каков правильный путь для этого запроса?Нужно ли использовать STUFF() в существующем STUFF() select?

1 Ответ

0 голосов
/ 12 октября 2018
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
...