SQL-将多个记录连接到一个记录

SQL-将多个记录连接到一个记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个SQL Server数据库,其中包含以下表格: 客户端(客户端ID、客户端名称) 销售代理(AgentID,AgentName) 项目(项目ID,说明) 采购(采购ID、客户ID、项目ID、价格) PurchaseSalesAgent(PurchaseID,AgentID) 每次购买对一个客户来说只是一件物品,但可能涉及多个代理。我想返回以下列列表: 客户名称、描述、价格、代理 其中Agents是参与购买的所有代理的名称。可以作为逗号分隔的列表,也可以作为多个列,每个列中有一个代理 我正

我有一个SQL Server数据库,其中包含以下表格:

客户端(客户端ID、客户端名称)

销售代理(AgentID,AgentName)

项目(项目ID,说明)

采购(采购ID、客户ID、项目ID、价格)

PurchaseSalesAgent(PurchaseID,AgentID)

每次购买对一个客户来说只是一件物品,但可能涉及多个代理。我想返回以下列列表:

客户名称、描述、价格、代理

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


我正在寻找一种与SQL Server 2000兼容的方法,但我也对SQL Server 2008中是否有更好的方法感兴趣。

在SQL 2008中,您应该使用for 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中,没有很好的实现方法。

使用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
编辑


我假设购买表有一个列ItemID INT链接到项目表

返回可变列数不是一个好主意。您的
购买表
没有任何对
项目
表的引用。感谢您提醒我关于ItemID的问题。当您说这不是一个好主意时,有什么具体的原因吗?谢谢,如果使用SQL Server 2000也会很好,但这对SQL 2008非常有用。