【问题标题】:Insert from one table with dupilcate data to new normalised tables从具有重复数据的一个表插入到新的规范化表
【发布时间】:2016-06-23 20:17:27
【问题描述】:

我有一张旧表,设置如下

电子邮件
[IdEmail]
[电子邮件地址]
[城市]

最多有 5 个不同的City's,并且与EmailAddress 存在一些重复数据。

我的新设置有这两个表(为了举例,我已对其进行了简化)。

电子邮件地址列表表
[IdEmailAddress]
[电子邮件地址]

电子邮件订阅
[IdEmail订阅]
[电子邮件地址 ID] (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

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

电子邮件地址列表表

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

电子邮件订阅

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

【问题讨论】:

  • 重复邮件是什么意思,只有mailaddress列是重复的?或整列
  • 旧表中的 EmailAddress 列有重复的地址以覆盖各个城市,我想在新表中规范化这一点,只有一个电子邮件地址条目和多个链接 ID 的 EmailSubscription 条目
  • 1) 创建新表 2) 向其中插入数据 3) 修改 EmailSubscriptions(添加新列) 4) 将数据插入新列 5) 删除具有字符串地址的列 EmailSubscriptions 6) 删除重复项
  • @progpow 感谢您的回复,但我不确定该方法是否可行 - 电子邮件的 ID 需要匹配,简单地删除重复项不会使用正确的电子邮件更新订阅链接记录ID(并且很可能导致外键限制异常)。 EmailAddressListTableEmailSubscritions 具有一对多关系。
  • @GJKH 如果在第二阶段你有没有重复的桌子,它可以解决任务吗?

标签: sql sql-server tsql normalization


【解决方案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

【讨论】:

  • 谢谢,很有魅力,现在我已经看到它坏了,实际上很简单。
猜你喜欢
  • 2011-07-07
  • 2015-11-13
  • 1970-01-01
  • 2021-10-09
  • 2018-05-31
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多