SQL Server объединяет строки с помощью связанных таблиц "многие ко многим".


Я уже искал свою проблему, но большинство примеров (если не все), имеют дело только с одной или двумя таблицами с отношением один ко многим между ними. Итак, вот мой сценарий:

Моя первая таблица:

OrderID Quantity    Price
----------------------------------
18      1000.00     160.00
19      1000.00     40.00
22      1000.00     40.00
23      100.00      500.00
24      10.00       50.00

Моя вторая таблица:

ExtrasID    Name
-------------------
1           Value 1
2           Value 2
3           Value 3
4           Value 4
5           Value 5

У меня есть отношение "многие ко многим", установленное между таблицами выше, поэтому есть третья (совместная) таблица, которая выглядит следующим образом:

OrderExtrassID  OrderExtras_OrderID OrderExtras_ExtrasID
----------------------------------------------------------------
20              19                  2
22              22                  3
23              23                  2
24              23                  5

Теперь все, чего я хочу добиться, - это получить такой результат, как следующее:

OrderID Extras
----------------------------
18      NULL
19      Value 2
22      Value 3
23      Value 2, Value 5
24      NULL

Есть много примеров использования XML PATH, PIVOT, CTE и т. д. но ни один из них, кажется, не помогает мне с моим сценарием, или, по крайней мере, мне не удалось изучить их глубоко, чтобы закончить свою работу...

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

1 2

1 ответ:

Я бы предложил использовать For XML для возврата нескольких строк в одну строку, а затем использовать STUFF для удаления лишней запятой. Что-то вроде этого:

SELECT O.OrderId
 ,STUFF(
        (
            SELECT ',' + E.Name AS [text()]
                FROM OrderExtras OE
                    Inner Join Extras E 
                        ON E.ExtrasId = OE.OrderExtras_ExtrasID
                WHERE O.OrderId = OE.OrderExtras_OrderID
            ORDER BY E.Name
            FOR XML PATH('')
        ), 1, 1, '') AS ColList
FROM Orders O

А вот и скрипкаSQL .

Удачи.