SQL - 加入多个记录到一个记录

SQL - 加入多个记录到一个记录

问题描述:

我有与下表SQL Server数据库:SQL - 加入多个记录到一个记录

客户(客户端ID,客户端名)

SalesAgent(AGENTID,AGENTNAME)

项目(项ID,说明)

购买(PurchaseID,客户端ID,项目ID,价格)

PurchaseSalesAgent(PurchaseID,AGENTID)

每单仅是以往一个项目一个客户端,但也已经可以涉及多个座席。我想回到列的以下列表:

CLIENTNAME,说明,价格,代理

其中代理是参与购买的所有代理的名称。既可以作为逗号分隔的列表,也可以作为每列有一个代理的多列。

我正在寻找一种方式,是与SQL Server 2000兼容,但我也希望有兴趣,如果有在SQL Server这样做的更好的方法2008年

+0

返回可变数量的列不是一个好主意。 – 2010-04-02 07:52:55

+0

您的'购买'表没有任何引用'项目'表。 – 2010-04-02 07:56:40

+0

感谢您提醒我有关ItemID的信息。 当你说不是个好主意时,有什么具体的原因吗? – 2010-04-02 08:59:44

在SQL 2008,您应该使用XML PATH('')...类似于:

select c.clientname, i.description, p.price, 
    stuff((select ', ' + a.AgentName 
    from SalesAgent sa join PurchaseSalesAgent psa on psa.AgentID = sa.AgentID 
    where psa.PurchaseID = p.purchaseID 
    for xml path('')),1,2,'') as Agents 
from client c 
join purchase p on p.clientid = c.clientid 
join item i on i.itemid = p.itemid 
; 

在SQL 2000中,没有很好的方法来做到这一点。

+0

谢谢你,对于SQL Server 2000也会很好,但是这对SQL 2008非常有用。 – 2010-04-02 09:50:56

使用SQL Server 2008,你可以尝试

DECLARE @Client TABLE (ClientID INT, ClientName VARCHAR(10)) 

DECLARE @SalesAgent TABLE (AgentID INT, AgentName VARCHAR(10)) 

DECLARE @Item TABLE (ItemID INT, Description VARCHAR(10)) 

DECLARE @Purchase TABLE (PurchaseID INT , ClientID INT, ItemID INT, Price FLOAT) 

DECLARE @PurchaseSalesAgent TABLE (PurchaseID INT, AgentID INT) 


SELECT c.ClientName, 
     i.Description, 
     p.Price  , 
     (
      SELECT sa.AgentName + ',' 
      FROM @SalesAgent sa 
      WHERE sa.AgentID = pa.AgentID 
      FOR XML PATH('') 
     ) Agents 
FROm @Client c INNER JOIN 
     @Purchase p ON c.ClientID = p.ClientID INNER JOIN 
     @PurchaseSalesAgent pa ON p.PurchaseID = pa.PurchaseID INNER JOIN 
     @Item i ON p.ItemID = i.ItemID 

编辑

我做了购表人有一栏项目ID INT链接到项目表假设