3

我有 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从表格中获取。产品可以有很多组件,组件在很多产品中。现在我有Product2 行 - 蛋糕和面包。在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.

请帮助做出正确的查询。

4

1 回答 1

3

我认为在您的客户端应用程序中执行此操作会更好、更容易。SQL 与格式化无关。

但是,如果您想在 SQL 中以任何方式执行此操作,您可以使用FOR XMLto 对每个分组产品的组件名称进行分组连接,如下所示:

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;
于 2013-02-14T09:19:02.367 回答