Объединить результаты из другой таблицы

У меня две таблицы

TableA has three fields
Id | FieldA | SomethingElse

TableB has three fields as well
Id | FieldA_FK | FieldB

Мы можем присоединиться к столам на

TableA.FieldA = TableB.FieldA_FK

Я хотел бы выбрать значения в обеих этих таблицах, чтобы получить следующий набор данных:

TableA.Id, TableA.FieldA, TableA.SomethingElse, [Concatenation of TableB.FieldB]

Чтобы получить [Конкатенация TableB.FieldB], я знаю, что могу сделать

declare @result varchar(500);
set @result = '';
select @result = COALESCE(@result + ',', '')  + FieldB 
from TableB b 
join TableA a on a.FieldA = b.FieldA_FK
select @result

Как получить описанный выше результат с конкатенацией только в одной строке результатов?

Заранее спасибо.

Примеры данных:

TableA
1   A   something
2   B   somethingElse

TableB
1   A   Aa
2   A   Ab
3   A   Ac
4   B   Ba
5   B   Bb

Я хотел бы получить

1   A   something       Aa, Ab, Ac
2   B   somethingElse   Ba, Bb

2 ответа

Решение

Вы можете использовать команду FOR XML PATH:

SELECT 
    TableA.Id, TableA.FieldA, TableA.SomethingElse,
    [Concatenation of TableB.FieldB] =
    (STUFF((SELECT CAST(', ' + TableB.FieldB AS VARCHAR(MAX)) 
            FROM TableB
            WHERE (TableA.FieldA = TableB.FieldA_FK) 
            FOR XML PATH ('')), 1, 2, '')) 
FROM TableA 

демонстрация

Это не так очевидно, как должно быть, но вы можете злоупотреблять методами XML SQL:

select a.ID, a.FieldA, a.FieldB
, stuff(
   (select ', ' + TableB.FieldB
   from TableB 
   inner join TableA on TableB.TableA_FK = TableA.ID
   for xml path(''), type
   ).value('(./text())[1]', 'varchar(max)')
   , 1,2,'')
from TableA a

Смотрите эту скрипку: http://sqlfiddle.com/

Другие вопросы по тегам