【问题标题】:Combine two tables in one [closed]将两个表合二为一[关闭]
【发布时间】:2012-04-24 09:03:00
【问题描述】:

我在 MSSQL Server 2012 中有两张表,想将它们合并到一张新表中。它们由列 messageID 链接。第一个表(Message)有

messageID
sender
date

第二张表(recipientInfo)有

messageID
recipient

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

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

【问题讨论】:

  • 您想创建一个视图并将现有表保留在那里吗?还是要永久合并这两个表?
  • @Ste 我想要一张新桌子,所以是永久组合
  • @casperOne 这不是一个真正的问题吗?我也得到了一个非常好的答案,我接受了。你有什么问题?
  • @Freek8 问题是你的; Stack Overflow 上的问题预计会显示您尚未完成的研究工作。我强烈建议阅读Stack Overflow is not Your Personal Research Assistant,以便更好地理解为什么这个问题不符合网站的质量标准。
  • @casperOne 我没发现问题

标签: sql sql-server-2012


【解决方案1】:

可能是这样的(如果您使用的是 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]

【讨论】:

  • +1 For Xml Path 是旋转和连接值的最佳解决方案
  • @Arion 谢谢,这就像一个魅力。而且真的很快!
  • @devarc:谢谢:P。是的。
  • @Freek8:没问题。很高兴为您提供帮助
  • @Freek8 :它将值连接为 xml。然后这些东西使它成为一个varchar。如果您有兴趣,请阅读projectdmx.com/tsql/rowconcatenate.aspx
【解决方案2】:

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

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

【讨论】:

  • 是的,但你几乎没有给我三十秒的时间来删除评论并修改我的答案。
  • 谢谢,这个也可以。由于 Arion 的解决方案占用的空间更少,我将使用该解决方案
【解决方案3】:
select msg.messageID, msg.sender, rep.recipient, msg.date 
from Message msg 
left outer join recipientInfo rep on msg.messageID = rep.messageID

【讨论】:

    【解决方案4】:

    您可能需要在这里整理拼写

      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
    

    【讨论】:

      【解决方案5】:

      你可以合并两个表

      https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        • 2012-10-21
        相关资源
        最近更新 更多