2011-03-26 44 views
2

我有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) 

我需要的僅僅是創建選擇爲表品牌。但我想要包含每個品牌的類別。如果我做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多個品牌,並且不想爲每個品牌記錄運行單獨的選擇。

+0

你能解釋一下你想達到什麼樣的?即,您打算如何使用該格式的數據? – 2011-03-27 00:09:16

+0

正如上一段所述,我在一個頁面中顯示所有品牌,並且想要添加它們所屬的類別。我想要在一行(記錄)上完成,而不是針對不同類別的一個品牌的3-4個記錄。 – feronovak 2011-03-27 00:18:45

回答

4
;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    
+0

謝謝,絕對宏偉...... – feronovak 2011-03-27 00:24:12