2012-04-24 296 views
2

我在MSSQL Server 2012中有兩個表,並希望將它們組合成一個新表。它們通過列messageID鏈接。第一個表(消息)具有將兩個表合併爲一個

messageID 
sender 
date 

第二個表(recipientInfo)具有

messageID 
recipient 

的主要問題是,在消息的messageId是主鍵,因此唯一的。在recipientInfo messageID不唯一(因爲一個消息可以有多個收件人)。我想有一個新的表,每個消息要麼

  • 一行,一列串連每封郵件
  • 多行的收件人,當有多個收件人(每行一個收件人)
+1

你想創建一個視圖,並保留現有的表呢?或者你想永久結合這兩張表嗎? – Ste 2012-04-24 09:06:17

+0

@Ste我想要一個新表,所以永久組合 – Freek8 2012-04-24 09:07:55

+0

然後使用SELECT INTO – devarc 2012-04-24 09:09:01

回答

4

也許是這樣的(如果您使用的是MSSQL 2005+):

CREATE TABLE NewTable 
(
    messageID INT, 
    sender VARCHAR(100), 
    recipient VARCHAR(MAX), 
    date DATETIME 
) 
INSERT INTO NewTable(messageID,sender,recipient,date) 
SELECT 
    [Message].messageID, 
    [Message].sender, 
    STUFF 
    (
     (
      SELECT 
       ',' +recipient 
      FROM 
       recipientInfo 
      WHERE 
       recipientInfo.messageID=[Message].messageID 
      FOR XML PATH('') 
     ) 
    ,1,1,'') AS recipient, 
    [Message].date 
FROM 
    [Message] 
+0

+1對於Xml路徑來說是最好的解決方案來樞軸轉接和連接值 – devarc 2012-04-24 09:21:14

+0

@Arion謝謝,這就像一個魅力。而且太快了! – Freek8 2012-04-24 09:21:39

+0

@devarc:謝謝:P.是的。 – Arion 2012-04-24 09:23:03

1

你想創建一個視圖,並保留現有的表嗎?或者你想永久結合這兩張表嗎?

SELECT m.messageID, m.sender, m.date, r.recipient 
INTO New_Table 
FROM Message m LEFT OUTER JOIN 
recipientinfo r on m.messageID = r.messageID 
+0

是的,但你幾乎沒有給我三十秒鐘來刪除評論並修改我的答案。 – Ste 2012-04-24 09:18:20

+0

謝謝,這個也可以。由於Arion的解決方案佔用更少的空間,所以我很樂意與您分享。 – Freek8 2012-04-24 09:25:20

+0

很高興爲您排序。 – Ste 2012-04-24 11:09:47

0
select msg.messageID, msg.sender, rep.recipient, msg.date 
from Message msg 
left outer join recipientInfo rep on msg.messageID = rep.messageID 
0

,你可能需要將拼寫出在這裏整理

select sender,date,(select recipient+chr(10) from receipientInfo as r where r.messageid = m.messageid order by r.recipient FOR XML PATH ('')) as receipents from message as m