【问题标题】:How do I merge two tables in Access while removing duplicates?如何在 Access 中合并两个表同时删除重复项?
【发布时间】:2011-09-30 20:12:11
【问题描述】:

我已经在线阅读了所有可能的解决方案,每次都得到不同的结果。

我有两个表:Clients 和 Patrons。它们都具有相同的结构:LastName、FirstName、Address、City、State 和 Zip。 Clients 有 108,000 个条目,而 Patrons 只有 42,000 个条目。并且其中一些条目在两者之间重复,因为我没有 150,000 个客户。

我需要一份连贯的清单。我遇到的问题是我的一些客户位于同一个地址,所以我不能简单地删除重复的地址,因为这会删除一个合法的客户。我有一些客户的名字很常见,比如 Jane Doe,其中有几个在不同的地址,所以我不能只过滤掉重复的姓氏或名字。

我正在使用 Microsoft Access 2010。

简单地将唯一值变为 YES 并没有帮助。

我搜索了 Microsoft 帮助文件,我得到了 2 到 168,000 的结果,几乎所有的结果都介于两者之间。

如何获得一个没有重复的列表,而不必按字母顺序排列并逐行输入 150,000 个条目??

【问题讨论】:

  • 我们的业务设置方式,有些是客户和赞助人,而大多数其他人只是其中之一。

标签: ms-access


【解决方案1】:

UNION 查询只返回不同的行。 (也有 UNION ALL,但它会包含重复的行,所以你不希望它在这里。)

试试这个查询。如果它没有返回你想要的,请解释为什么 if 不足。

SELECT LastName, FirstName, Address, City, State, Zip
FROM Clients
UNION
SELECT LastName, FirstName, Address, City, State, Zip
FROM Patrons
ORDER BY LastName, FirstName;

您可能需要 ORDER BY 中的另一个或多个字段。我只是提供了一些开始。

【讨论】:

  • 这实际上给了我使用查询时得到的相同数字。所以我很高兴!我现在有两种不同的方法可以产生相同的结果。非常感谢!
【解决方案2】:

执行此操作的一种方法是执行 FULL OUTER JOIN 并 COALESCE 值。这将让您知道它是否在客户表、赞助人表或两者中

不幸的是,AFAIK Access 没有 FULL OUTER,因此您需要对其进行模拟。

SELECT a.LastName, a.FirstName, a.Address, a.City, a.State, a.Zip , "Both" as type
FROM Clients a INNER JOIN Patrons b 
ON a.LastName = b.LastName 
   AND a.Address = b.Address
   AND a.City = b.City
   AND a.State = b.State
   AND a.Zip = b.Zip
UNION ALL
SELECT a.LastName, a.FirstName, a.Address, a.City, a.State, a.Zip , "Client" as type
FROM Clients a LEFT JOIN Patrons b 
ON a.LastName = b.LastName 
   AND a.Address = b.Address
   AND a.City = b.City
   AND a.State = b.State
   AND a.Zip = b.Zip
WHERE 
    b.PatronID is null (Or whatever the PK is)
UNION ALL
SELECT b.LastName, b.FirstName, b.Address, b.City, b.State, b.Zip , "Patron" as type
FROM Clients a RIGHT JOIN Patrons b 
ON a.LastName = b.LastName 
   AND a.Address = b.Address
   AND a.City = b.City
   AND a.State = b.State
   AND a.Zip = b.Zip
WHERE 
    a.ClientID is null (Or whatever the PK is)

如果您只需要一个列表,但您应该使用 HansUp 的答案

【讨论】:

  • 我希望我有足够的代表来解决这个问题。我喜欢玩这个,虽然最后我只需要一个列表^^
【解决方案3】:

我不确定构建一个完全自动化的解决方案是否值得这份工作:您将永远无法构建一个将Doe, Jane, 1234 Sunset BoulevardDoe, Jane, 1234 Sunset Bd 视为同一个人的代码,尽管它们实际上是同一个人!

如果我是你,我会构建一个 4 步半自动化解决方案:

  1. 将两个表合并到一个唯一的表中,添加一个“isDuplicate”布尔字段
  2. 通过查询显示所有相似的名称,并精心挑选要删除的重复项
  3. 通过查询显示所有相似(尽可能相似)的地址和要删除的精选重复项
  4. 删除“isDuplicate”设置为 True 的所有记录

当然,这种方法只有在重复名称\地址有限的情况下才有意义!我猜你的过滤器会给你几百条记录来考虑。需要花多长时间?一两个小时?我认为这份工作值得!通过自动化此过程,您将永远无法确保消除所有重复项,您也无法确保没有删除任何合法客户端。通过以这种方式完成工作,您将确定您的结果。

【讨论】:

    【解决方案4】:

    我也在寻找更好的方法来做到这一点,但我很惊讶这里的答案有点“困难”。鉴于没有简单的方法可以自动连接,有一种使用 Access 原生函数的简单方法。

    使用查询向导创建“不匹配”查询。这将创建一个参与者列表,这些参与者存在于一个表上,但不是两个表(您在向导期间指定哪个表)。然后,您可以随意附加这些记录或创建一个新表。

    我不知道在这一步中混合记录数据的方法,因为那要复杂得多。

    【讨论】:

    • 欢迎来到stackoverflow!这不是问题的答案,您想提出一个新问题并参考这个问题吗?
    猜你喜欢
    • 2017-06-05
    • 2016-05-29
    • 1970-01-01
    • 2013-10-10
    • 2015-11-29
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多