如何在删除重复项时在Access中合并两个表?

时间:2011-09-30 20:12:11

标签: ms-access

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

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

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

我正在使用Microsoft Access 2010。

简单地将唯一值转换为YES无济于事。

我已经搜索过微软的帮助文件了,我得到的结果是2到168,000,其中大部分都介于两者之间。

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

4 个答案:

答案 0 :(得分:8)

UNION查询仅返回不同的行。 (还有UNION ALL,但这会包含重复的行,因此您不需要它。)

尝试此查询。如果它没有返回你想要的东西,请解释为什么如果不合适。

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中的其他字段。我刚开始提供一些东西。

答案 1 :(得分: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的回答

答案 2 :(得分:0)

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

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

  1. 将两个表合并到一个唯一的表中,添加'isDuplicate'布尔字段
  2. 通过查询显示所有相似的名称,并手工复制要删除的副本
  3. 通过查询显示所有类似(尽可能相似)的地址,并选择要删除的重复列表
  4. 删除'isDuplicate'设置为True的所有记录
  5. 当然,只有重复的名称\地址有限时,此方法才有意义!我想你的过滤会给你几百条记录。这需要多长时间?一两个小时?我认为值得这份工作!通过自动执行此过程,您将永远无法确保消除所有重复项,也不会确定没有删除任何合法客户端。通过这种方式完成工作,您将确定您的结果。

答案 3 :(得分:0)

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

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

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