Возврат результата нескольких строк в одну запись - PullRequest
2 голосов
/ 27 марта 2011

У меня есть таблица n: m, которая связывает данные между двумя таблицами:

id | category 
-------------
2  | car
3  | bike

id | brand
-------------
4  | honda
5  | bmw
6  | mazda
7  | harley davidson

и таблица n: m

id | pk_category | pk_brand
-----------------------------
1  | 2 (car)     | 4 (honda)
2  | 3 (bike)    | 4 (honda)
3  | 2 (car)     | 6 (mazda)
4  | 3 (bike)    | 7 (harley)

Что мне нужно, так это создать select для таблицы бренда.Но я хочу включить категории для каждого бренда.Если я сделаю JOIN, то у меня будет две записи для Honda

Также представьте, что есть 8 категорий и более 500 брендов.

Итак, есть ли способ создать select * from brands, который будет возвращать таблицу следующим образом:

id | brand    | categories
--------------------------
4  | honda    | 2,3 (or different separator)
5  | bmw      | null
6  | mazda    | 2
7  | harley   | 3

Я действительно изо всех сил пытаюсь создать что-то подобное.Я хочу запросить 50+ брендов для одной страницы и не хочу делать отдельные выборки для каждой записи бренда.

1 Ответ

4 голосов
/ 27 марта 2011
;WITH brands(id,brand) AS
(
SELECT 4,'honda' UNION ALL
SELECT  5,'bmw' UNION ALL
SELECT 6,'mazda' UNION ALL
SELECT 7,'harley davidson'
),
brand_categories(id,pk_category,pk_brand)AS
(
SELECT 1,2,4 UNION ALL
SELECT 2,3,4 UNION ALL
SELECT 3,2,6 UNION ALL
SELECT 4,3,7
)
SELECT id,
       brand,
       LEFT(categories, LEN(categories) - 1) AS categories
FROM   brands b
       CROSS APPLY (SELECT CAST(pk_category as varchar) + ','
                    FROM   brand_categories bc
                    WHERE  bc.pk_brand = b.id
                    FOR XML PATH('')) ca(categories) 

Возвращает

id          brand           categories
----------- --------------- ------------
4           honda           2,3
5           bmw             NULL
6           mazda           2
7           harley davidson 3             
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...