2013-02-14 133 views
2

我有2個表,產品和組件集團通過與加盟(多對多)

CREATE TABLE Product(
ProductId uniqueidentifier DEFAULT NEWID(), 
ProductName nvarchar(25) NOT NULL, 
CONSTRAINT PK_Product PRIMARY KEY (ProductId)) 


CREATE TABLE Component 
(
    ComponentId uniqueidentifier DEFAULT NEWID(), 
    ComponentName nvarchar(25) NOT NULL, 
    CONSTRAINT PK_Component PRIMARY KEY (ComponentId) 
) 

我需要一個連接「多對多」,所以我創建第三個表

CREATE TABLE Product_Component(
idProduct_Component uniqueidentifier DEFAULT NEWID(), 
idProduct uniqueidentifier, 
idComponent uniqueidentifier, 

CONSTRAINT PK_idProduct_Component PRIMARY KEY (idProduct_Component), 

CONSTRAINT FK_idComponent FOREIGN KEY (idComponent) 
REFERENCES Component (ComponentId), 
CONSTRAINT FK_idProduct FOREIGN KEY (idProduct) 
REFERENCES Product (ProductId)) 

我增加了一些數據,現在我可以從表select。產品可以有很多組件,組件在許多產品中。現在我在Product 2行 - 蛋糕和麪包。在Component我有3行 - 糖,鹽和麪粉。我在表Product_Component中增加了值,現在我有些像蛋糕包括糖和麪粉,麪包包括鹽和麪粉。我用這樣的

SELECT Product.ProductName, Component.ComponentName FROM Product_Component 
JOIN Component 
ON Product_Component.idComponent = Component.ComponentId 
JOIN Product 
ON Product_Component.idProduct = Product.ProductId 
WHERE Product.ProductName = 'Bread' 

查詢,我看到所有面包的成分,但每一行是一樣的東西

bread | salt 
bread | flour 

,我希望看到這樣的事情

bread | salt 
     | flour 
     | some other component 

我試過

SELECT Product.ProductName, Component.ComponentName FROM Product_Component 
JOIN Component 
ON Product_Component.idComponent = Component.ComponentId 
JOIN Product 
ON Product_Component.idProduct = Product.ProductId 
WHERE Product.ProductName = 'Bread' 
GROUP BY Product.ProductName 

但我有留言

Column 'Component.ComponentName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

請幫助做出正確的查詢。

+0

你想組CONCAT每個產品名稱的組件名稱的值?同時請發佈您嘗試的確切查詢,查詢中的「GROUP BY」在哪裏? – 2013-02-14 09:07:54

+0

@MahmoudGamal我編輯了我的查詢 – user1947702 2013-02-14 09:12:01

+0

對於每個分組產品名稱,您想爲組件名稱選擇什麼?你想選擇他們在同一行中分組在一起嗎?你不能簡單地在SQL中做到這一點,更好地刪除組,並在客戶端應用程序中做這種格式化的東西。 – 2013-02-14 09:12:45

回答

3

我認爲在客戶端應用程序中執行此操作會更好更容易。 SQL與格式無關。

然而,如果你想這樣做在SQL中的任何方式,你可以使用FOR XML的部件名稱組串聯像這樣每個分組的產品:

SELECT 
    p.ProductName, 
    STUFF((
    SELECT ', ' + c2.ComponentName 
    FROM Component AS c2 
    WHERE c2.idComponent = pc.idComponent 
    FOR XML PATH ('')) 
    ,1,2,'') AS ComponentsNames 
FROM Product_Component AS pc 
JOIN Component   AS c ON pc.idComponent = c.ComponentId 
JOIN Product   AS p ON pc.idProduct = p.ProductId 
WHERE p.ProductName = 'Bread' 
GROUP BY p.ProductName; 
+0

\\\\非常感謝! – user1947702 2013-02-14 09:25:17

+0

@ user1947702 - 隨時歡迎您:)很高興我能幫忙:) – 2013-02-14 09:25:37