Выбор с помощью LEFT OUTER JOIN и возврат в виде списка, разделенного запятыми

В MS SQL Server 2008, как мне сделать оператор выбора, который объединяет две таблицы и возвращает содержимое таблицы 2 в виде списка, разделенного запятыми?

Пример: Таблица 1 содержит все мои заказы, а таблица 2 — строки моих заказов. Я хочу выбрать все поля из заказов, а также список всех полей, разделенных запятыми, из соответствующих строк заказа, причем каждая строка заказа разделена точкой с запятой (или чем-то еще).

Что-то вроде этого:

| Orders.custno | Orders.name | Orders.email     | Orders.phone | Order lines                                                         |
|---------------|-------------|------------------|--------------|---------------------------------------------------------------------|
| 123456        | Dave        | [email protected] | 1234567890   | “112233”,”Running shoes”,”495.00”;”223344”,”Roller blades”,”699.00” |

Надеюсь, это имеет смысл.

Спасибо.


person Ploughansen    schedule 27.05.2018    source источник
comment
Без образцов данных и желаемых результатов никто не сможет вам помочь. А пока вы можете помочь себе и погуглить агрегацию строк SQL Server.   -  person Gordon Linoff    schedule 28.05.2018
comment
Спасибо. Я был почти уверен, что я не единственный, кто когда-либо сталкивался с этой проблемой, поэтому, конечно, этот вопрос задавался раньше. Однако иногда может быть сложно найти решение в Google, когда вы не совсем уверены, как сформулировать вопрос.   -  person Ploughansen    schedule 28.05.2018


Ответы (1)


Если я правильно понял ваш вопрос, то ниже приведено решение SQLFiddler

SELECT p.productId,p.ProductName,tmp.List_output
FROM product p
LEFT OUTER JOIN 
(
SELECT  ProductId
       ,STUFF((SELECT ', ' + CAST(ProductLine AS VARCHAR(10)) [text()]
         FROM ProductLine 
         WHERE ProductId = t.ProductId
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output
FROM ProductLine t
GROUP BY ProductId) tmp ON tmp.ProductId = p.ProductId 
person Rajat Jaiswal    schedule 28.05.2018