совокупная строка tsql для группировки по

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

Имена (идентификатор, имя) Адреса (идентификатор, имя_идентификатор, адрес)

Я хочу написать запрос, который возвращает мне: имя, список адресов (адрес1, адрес2, адрес3, ..)

Что-то типа:

Select A.name, B.list_of_addresses
From Names A
    Inner Join (Select name_id, /*list_of_addresses with comma between them*/
                From Addresses
                Group By name_id)  B ON A.id=B.name_id

person Naor    schedule 24.01.2011    source источник
comment
Для какой версии SQL Server?   -  person OMG Ponies    schedule 25.01.2011
comment
Вы можете использовать обычное табличное выражение для объединения строк, тогда остальная часть запроса будет работать.   -  person Ken Downs    schedule 25.01.2011
comment
@Ken Downs: Можешь привести пример? Я действительно не понимаю. @OMG Ponies: я использую SQL Server 2005.   -  person Naor    schedule 25.01.2011


Ответы (1)


Вы можете использовать For XML в качестве трюка, чтобы добиться этого, начиная с SQL Server 2005.

Select
    A.name,
    stuff((
        select ',' + B.address
        from Addresses B
        WHERE A.id=B.name_id
        for xml path('')),1,1,'')
From Names A

Это хорошо работает, если у вас еще нет запятых в адресе, но даже если они есть, поскольку ваш запрос состоит в том, чтобы поставить запятые между ними ... это, вероятно, так же «правильно».

person RichardTheKiwi    schedule 24.01.2011
comment
Что делает для xml path('')? - person Naor; 25.01.2011
comment
FOR XML возвращает данные в формате XML. Path(x) дает имя тега для каждого узла. Path('') дает пустое имя, поэтому значения узла (','+B.address) заканчиваются как обычный текст, а не в одной строке. STUFF — это функция для удаления первого ',' из списка. - person RichardTheKiwi; 25.01.2011
comment
Вы знаете, как я могу получить результат в С#? имеет ли результат тип строки? XML? - person Naor; 25.01.2011
comment
Второй столбец — это столбец NVARCHAR(MAX). - person RichardTheKiwi; 25.01.2011