2012-04-24 185 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