我有一个带有下表的SQL Server数据库:
客户(ClientID,ClientName)
SalesAgent (AgentID,AgentName)
项目(ItemID,描述)
购买(PurchaseID,ClientID,ItemID,价格)
PurchaseSalesAgent (PurchaseID,AgentID)
每次购买只是一个项目到一个客户,但可能涉及多个代理。我想返回以下列列表:
ClientName,Description,Price,Agents
代理商是购买中涉及的所有代理商的名称。可以是逗号分隔列表,也可以是多列,每个列中都有一个代理。
我正在寻找一种与SQL Server 2000兼容的方法,但如果在SQL Server 2008中有更好的方法,我也会感兴趣。
答案 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 列链接到项目表