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

时间:2010-04-02 07:47:52

标签: sql sql-server tsql

我有一个带有下表的SQL Server数据库:

客户(ClientID,ClientName)

SalesAgent (AgentID,AgentName)

项目(ItemID,描述)

购买(PurchaseID,ClientID,ItemID,价格)

PurchaseSalesAgent (PurchaseID,AgentID)

每次购买只是一个项目到一个客户,但可能涉及多个代理。我想返回以下列列表:

ClientName,Description,Price,Agents

代理商是购买中涉及的所有代理商的名称。可以是逗号分隔列表,也可以是多列,每个列中都有一个代理。

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

2 个答案:

答案 0 :(得分:1)

在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中,没有很好的方法。

答案 1 :(得分:1)

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

修改

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