我有一个Access 2003表,其中有大约4000条记录,这些记录是由17个不同的表组成的。这些记录中大约有一半是重复的。没有唯一的标识列(id,name等)。有一个id列在表结合时自动填充,这意味着重复项不完全相同(尽管如果事情变得容易,可以删除此列)。
我使用了Access Find Duplicates查询向导,该向导为我提供了重复记录的列表,但不允许我删除它们(如果我不能删除它们,请认真使用此查询?)。我已经尝试将生成的查询转换为删除查询,但这会更改它找到的行数。我会手动更改sql,但它有点超出我的范围,长7行。
有没有人知道摆脱重复的好方法?
答案 0 :(得分:7)
查找重复查询的原因不允许您删除记录,因为它基本上只是一个聚合查询,它计算它找到的重复数,并返回计数大于1的情况。
考虑一下,如果您确实根据查找重复项进行了删除查询,它将删除所有具有重复值的行,这可能不是您想要的。您想要删除除重复之外的所有副本。
除了比较中的ID列之外,您应该尝试删除除1之外的所有记录重复项。我建议最简单的方法是对所有unique values(从MyTable中选择Distinct Field1,Field2 ...)进行生成表查询,而不是除之外的每个字段。 ID字段,使用a中的结果创建大约2000条记录的新表(如果一半是重复的)。
然后,在新表上创建一个ID列,使用更新查询将此ID更新为原始表中的第一个匹配ID(您可以使用DLookup,执行此操作,这将返回第一个EXPRESSION值,其中CRITERIA在DOMAIN中是真的)。
DLookup()函数返回一个 即使更多,也来自单个字段的值 超过一个记录满足 标准。如果没有记录满足 条件,或者域名包含否 记录,DLookup()返回Null。
由于您基于所有其他字段(唯一值)识别第一个匹配ID,因此不匹配的ID将属于重复项。您将颠倒PK关系,在给定一组唯一字段的情况下识别第一个匹配键。之后,您应该将ID设置为PK。当然,这假设ID没有固有含义,并且您不关心将给定重复行的一个特定ID保留在属于其他重复行的任何ID上。这假设您关心ID列中的数据,因此您希望为所有剩余的行保留它,否则只需忽略DLookup步骤并对除ID之外的所有列执行Select Distinct。
答案 1 :(得分:1)
对除ID列以外的所有列使用select:
SELECT DISTINCTROW Column1, Column2, Column3
INTO MYNEWTABLE
FROM TABLE
您可以简单地交换姓名。
此解决方案将为您提供一个非重复的新表。
答案 2 :(得分:1)
以下内容将保留原始ID并一步完成:
DELETE FROM table_with_duplicates
WHERE table_with_duplicates.id NOT IN
(SELECT max(id)
FROM table_with_duplicates
GROUP BY duplicated_field_1, duplicated_field_2, ...
)
现在您拥有原始表,没有重复项和保留的ID。 并且始终记得在尝试使用大型DELETE之前备份数据。
答案 3 :(得分:1)
DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In
(SELECT max(ID)
FROM table_with_duplicates
GROUP BY [duplicated_field_1]
HAVING Count(*)>1
)
答案 4 :(得分:0)
实际上我找到了一个非常简单的解决方案需要一段时间但是它的所有字段都是完全相同的完整重复记录然后只对每个字段进行一次查询并按“Group BY”排序。因此,重复项将合并,您只需将此信息附加到新表,并将其重命名为与现有表相同。如果您有一个主键字段,您可以在查询中忽略它,然后它仍然会合并数据(假设您不关心主字段中的数据)。我不知道为什么没有人提到这个解决方案花了我5个小时。想出来。 :)