从具有dupilcate数据的一个表插入到新的规范化表中

时间:2016-03-09 12:40:39

标签: sql sql-server tsql normalization

我有一张旧表,其中包含以下设置

电子邮件
[IdEmail]
[EmailAddress的]
[市]

最多有5个不同City'sEmailAddress存在一些重复数据。

我的新设置有这两个表(我为了示例目的简化了这些表)。

EmailAddressListTable
[IdEmailAddress]
[EmailAddress的]

EmailSubscriptions
[IdEmailSubscriptions]
[EmailAddressID](FK)
[MailingListID] (城市)

如何在不复制重复的电子邮件地址的情况下插入新数据?或者通过简单的插入更容易插入所有记录,然后删除重复项并更改链接表中的相应ID?关于我如何做到这一点,我有点困惑。

更新

只是为了澄清,例如说旧表有记录:

ID  Email                   City
1   email@domain.com        1
2   email@domain.com        4
3   email@domain.com        5
4   NEWemail@Newdomain.com  1

我想把它转移到像这样的新表中

EmailAddressListTable

Id  Email
1   email@domain.com
2   NEWemail@NEWdomain.com

EmailSubscriptions

ID  EmailID  MailingListID
1   1        1
2   1        4
3   1        5
4   2        1

1 个答案:

答案 0 :(得分:1)

假设电子邮件地址是匹配项的唯一标识符,并且“电子邮件”表中可以忽略IdEmail列。

你可以这样做:

DECLARE @EmailAddressListTable TABLE 
(
    IdEmailAddress int identity(1,1) not null,
    EmailAddress nvarchar(50) not null
)

INSERT INTO @EmailAddressListTable
SELECT DISTINCT 
    EmailAddress
FROM Emails

SELECT * FROM @EmailAddressListTable -- show emails in new table

DECLARE @EmailSubscriptions TABLE
(
    IdEmailSubscriptions int identity(1,1) not null,
    EmailAddressID int not null,
    MailingListID int not null
)

INSERT INTO @EmailSubscriptions
SELECT 
    newEmails.IdEmailAddress, oldEmails.City 
FROM 
    @EmailAddressListTable newEmails
INNER JOIN
    Emails oldEmails on newEmails.EmailAddress = oldEmails.EmailAddress

SELECT * FROM @EmailSubscriptions -- show matches to email in subscriptions