0

每隔一段时间,我就会用那些回复我们 Craigslist 广告的人更新我们的研究招聘数据库。每个受访者都有一个唯一的respondentID,这是主键。

有时,人们会多次回复这些 Craigslist 广告。我认为我们的数据库中可能有重复的人,这很糟糕。

我想将我所有招聘表的主键从respondentID更改为Email,这将防止重复并更容易查找信息。我的数据库中可能已经有重复的电子邮件记录,如果有,我需要清理它。

这是我的三个招聘表的当前架构:

  1. 人口统计 - 包含类似的列RespondentID (PK)Email(我希望这是 PK)Phone,等
  2. 流派 - 包含RespondentID (PK),Horror等列
  3. platform - 包含RespondentID (PK),TV等列。

我想在某个时候将所有三个表连接在一起,以便我们更好地了解某人。

以下是我的问题:

  1. 如何消除数据库中已有的重复受访者?(我可以判断它们是否重复,因为它们将具有相同的电子邮件值。)
  2. 鉴于我当前的架构,如何在不弄乱数据的情况下将我的数据库转换为以电子邮件作为主键?
  3. 转换到新架构后,在将 Craigslist 广告电子表格中的重复项添加到演示、类型和平台表之前,我可以使用什么流程删除它们?

以下是我对解决方案的想法:

  1. 创建备份表。将三个表连接起来,将大表导出到 Excel。在 Excel 中,使用数据过滤和条件格式查找重复条目,然后手动删除它们。不幸的是,我有 20,000 条记录会导致 Excel 崩溃。:( 主要问题是我不知道如何使用 SQL 删除表中的重复条目。(另外,如果我有两个来自 bobdole@republican.com 的条目,则应该保留一个条目。)你能想出一个涉及 SQL 和 Access 的更智能的解决方案?

  2. 在每条电子邮件记录都是唯一的后,我将创建新表,每个表都使用电子邮件作为主键。

  3. 当我想删除要导入的数据中的重复项时,我应该能够在 Excel 中轻松完成。接下来,我将使用此 SQL 命令在当前数据库和传入数据之间进行重复数据删除:

    DELETE * from newParticipantsList
    WHERE Email in (SelectEmail from Demo)
    

我将尝试在 Access 的一个小测试表中复制我当前的体系结构,看看我是否能弄清楚。总的来说,我在SQL中加入表和删除数据的经验并不多,所以有点吓人。

4

2 回答 2

0

也许我只是厚脸皮,但你为什么不在现有的表中创建一个新的身份列呢?您始终可以删除那些您认为重复的记录,但身份列在任何情况下都保证是唯一的。

您可以通过检查电子邮件列来确保插入到表中的任何新记录都不重复。

于 2012-10-17T03:42:27.150 回答
0

要从人口统计表中删除重复项,您可以执行以下操作:

WITH RecordsToKeep AS (
SELECT  MIN(RespondentID) as RespondentID
    FROM    demographic 
GROUP BY Email 
) DELETE  demographic
FROM        demographic
LEFT JOIN   RecordsToKeep on RecordsToKeep.RespondentID = demographic.RespondentID
where   RecordsToKeep.RespondentID IS NULL

这将保留每个电子邮件地址的第一条记录并删除其余记录。在删除源之前,您需要重新映射流派和平台表。

就将来要做什么而言,您可以让 SQL 为您完成所有重复数据删除,方法是将数据导入临时表,然后仅当地址不在人口统计中时才将不同的记录导入到最终表中桌子。

没有理由将电子邮件地址更改为主键。出于多种原因,字符串不是很好的主键。您遇到的问题不在于重复键,问题在于您如何插入数据。

于 2012-10-17T04:03:12.560 回答