2010-04-02 98 views
2

我有與下表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

回答

1

在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

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 

編輯

我做了購表人有一欄項目ID INT鏈接到項目表假設