我已经在线阅读了所有可能的解决方案,每次都会得到不同的结果。
我有两张桌子:客户和顾客。它们都具有相同的结构:LastName,FirstName,Address,City,State和Zip。客户有108,000个条目,而Patrons只有42,000个条目。其中一些条目在两者之间重复,因为我没有150,000个客户。
我需要一个连贯的清单。我遇到的问题是我的一些客户端位于同一地址,所以我不能简单地删除重复的地址,因为这将删除合法的客户端。我有一些非常常见的客户,比如Jane Doe,其中有几个在不同的地址,所以我不能只过滤掉重复的姓氏或名字。
我正在使用Microsoft Access 2010。
简单地将唯一值转换为YES无济于事。
我已经搜索过微软的帮助文件了,我得到的结果是2到168,000,其中大部分都介于两者之间。
如何获得没有重复项的单个列表而不必按字母顺序排列并逐行进行150,000个条目?
答案 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 Boulevard
和Doe, Jane, 1234 Sunset Bd
视为同一个人的代码,尽管这些是真的同一个人!
如果我是你,我会建立一个4步骤的半自动化解决方案:
当然,只有重复的名称\地址有限时,此方法才有意义!我想你的过滤会给你几百条记录。这需要多长时间?一两个小时?我认为值得这份工作!通过自动执行此过程,您将永远无法确保消除所有重复项,也不会确定没有删除任何合法客户端。通过这种方式完成工作,您将确定您的结果。
答案 3 :(得分:0)
我正在寻找一种更好的方法来做到这一点,但我很惊讶这里的答案有点“难”。由于没有简单的方法可以自动连接,因此使用Access本机函数有一种简单的方法。
使用“查询”向导创建“不匹配”查询。这将创建一个参与者列表,这些参与者存在于一个表中,但不存在于两个表中(您在向导期间指定了哪些表)。然后,您可以根据需要附加这些记录或创建新表。
我不知道在这一步中混合记录数据的方法,因为这要复杂得多。