SQL - 加入多个记录到一个记录
问题描述:
我有与下表SQL Server数据库:SQL - 加入多个记录到一个记录
客户(客户端ID,客户端名)
SalesAgent(AGENTID,AGENTNAME)
项目(项ID,说明)
购买(PurchaseID,客户端ID,项目ID,价格)
PurchaseSalesAgent(PurchaseID,AGENTID)
每单仅是以往一个项目一个客户端,但也已经可以涉及多个座席。我想回到列的以下列表:
CLIENTNAME,说明,价格,代理
其中代理是参与购买的所有代理的名称。既可以作为逗号分隔的列表,也可以作为每列有一个代理的多列。
我正在寻找一种方式,是与SQL Server 2000兼容,但我也希望有兴趣,如果有在SQL Server这样做的更好的方法2008年
答
在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链接到项目表假设
返回可变数量的列不是一个好主意。 – 2010-04-02 07:52:55
您的'购买'表没有任何引用'项目'表。 – 2010-04-02 07:56:40
感谢您提醒我有关ItemID的信息。 当你说不是个好主意时,有什么具体的原因吗? – 2010-04-02 08:59:44