Sql 把两张桌子合在一起

Sql 把两张桌子合在一起,sql,sql-server-2012,Sql,Sql Server 2012,我在MSSQL Server 2012中有两个表,希望将它们合并到一个新表中。它们由messageID列链接。第一个表(消息)已被删除 第二个表(recipientInfo)具有 主要问题是消息中的messageID是主键,因此是唯一的。在recipientInfo中,messageID不是唯一的(因为一封邮件可以有多个收件人)。我想要一张有两张桌子的新桌子 每封邮件一行,收件人连接在一列中 当有多个收件人(每行一个收件人)时,每条邮件有多行 是否要创建视图并将现有表保留在那里?还是要永久合并

我在MSSQL Server 2012中有两个表,希望将它们合并到一个新表中。它们由messageID列链接。第一个表(消息)已被删除

第二个表(recipientInfo)具有

主要问题是消息中的messageID是主键,因此是唯一的。在recipientInfo中,messageID不是唯一的(因为一封邮件可以有多个收件人)。我想要一张有两张桌子的新桌子

  • 每封邮件一行,收件人连接在一列中
  • 当有多个收件人(每行一个收件人)时,每条邮件有多行

是否要创建视图并将现有表保留在那里?还是要永久合并这两个表

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

是否要创建视图并将现有表保留在那里?还是要永久合并这两个表

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

您可以合并这两个表


这可能更合适,而且有多种方法可以做到这一点

您可以合并这两个表

这可能是更合适的方法,有多种方法可以做到这一点

可能是这样的(如果您使用的是MSSQL 2005+):

可能是这样(如果您使用的是MSSQL 2005+):


你可能需要在这里对拼写进行分类

  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

你可能需要在这里对拼写进行分类

  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


是否要创建视图并将现有表保留在那里?还是想永久性地合并这两张桌子?@Ste我想要一张新桌子,所以永久性地合并combination@casperOne这在什么方面不是一个真正的问题?我也得到了一个非常好的答案,我接受了。你有什么问题?@Freek8问题是你的;有关堆栈溢出的问题预计会显示出您尚未完成的研究工作。我强烈建议阅读,以便更好地理解为什么这个问题不符合网站的质量标准。@casperOne我看不出问题所在。是否要创建一个视图并保留现有表?还是想永久性地合并这两张桌子?@Ste我想要一张新桌子,所以永久性地合并combination@casperOne这在什么方面不是一个真正的问题?我也得到了一个非常好的答案,我接受了。你有什么问题?@Freek8问题是你的;有关堆栈溢出的问题预计会显示出您尚未完成的研究工作。我强烈建议阅读,以便更好地理解为什么这个问题不符合网站的质量标准。@casperOne我看不出这个问题是的,但你只给了我30秒的时间来删除评论并修改我的答案。谢谢你,这个问题也行得通。因为Arion的解决方案占用的空间较少,所以我将使用该解决方案是的,但您只给了我30秒的时间来删除评论并修改我的答案。谢谢,这一个也有效。由于Arion的解决方案占用的空间较少,所以我将使用1+1 For Xml路径作为透视和连接的最佳解决方案values@Arion谢谢,这很有效。而且真的很快@德瓦克:谢谢,是的。@Freek8:没问题。乐意help@Freek8:它将值浓缩为xml。然后这些东西就变成了瓦查尔。若您感兴趣,那个么读取+1 For Xml路径是透视和连接的最佳解决方案values@Arion谢谢,这很有效。而且真的很快@德瓦克:谢谢,是的。@Freek8:没问题。乐意help@Freek8:它将值浓缩为xml。然后这些东西就变成了瓦查尔。如果你感兴趣,请阅读
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]
  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