如何删除 Access 表中的重复项(不使用查询)?
Posted
技术标签:
【中文标题】如何删除 Access 表中的重复项(不使用查询)?【英文标题】:How can I remove duplicates in my Access table (not using queries)? 【发布时间】:2012-08-16 16:39:52 【问题描述】:为清楚起见,我的表格中有 2 列。我觉得必须有一种方法可以做到这一点,但如果不做一个简单的查询,我想不出一种方法来实际做到这一点。我假设使用 VBA 来执行 UPDATE 语句并将其放入宏中,但是在做了一些研究之后,我没有想出任何特别有用的东西。我曾考虑过使用 DISTINCT,但似乎我不能在 UPDATE 语句中使用它。我应该如何解决这个问题?
编辑:抱歉,我似乎没有添加足够的信息,所以我将在此处添加。
如果我从这个开始:
Column 1 | Column 2
-------------------
A | 1
C | 3
B | 2
A | 1
C | 3
我试图以这个结束(行的顺序本身并不重要):
Column 1 | Column 2
-------------------
A | 1
C | 3
B | 2
有人问我为什么不尝试用查询来做这件事。答案是因为我使用了一个链接到我的表的表单(通过多个中间查询)。在这个表格上,我必须能够输入数据并将其添加到我的表格中。如果我使用查询删除重复项,则查询和表之间的关系不再是一对一的,因此我将无法在表单中输入信息。
我希望这是有道理的,但如果没有,请告诉我,我会很乐意进一步详细说明。
【问题讨论】:
需要更多细节,示例数据,不使用查询是什么意思,为什么不呢。向我们展示示例数据和预期结果。 使用查询是您在数据库中做事的方式。任何涉及通过 VBA 和宏进行更新的解决方案都只是运行一堆查询的不必要的复杂方式。 我编辑了我最初的帖子以回答为什么我需要使用表格以及一个示例。如果您需要更多详细信息,请告诉我。 如果您想通过查询删除重复项,您将需要一个唯一的 ID。自动编号会做得很好。 【参考方案1】:你需要使用一个记录集(因为你不能从你用查询指定的表结构中删除重复项,因为没有唯一的键来区分匹配的行,并得到一个你想要的必须创建一个新表):
dim rst as new adodb.recordset
dim c1 as string
dim c2 as string
rst.open "SELECT Column1, Column2 FROM TableName ORDER BY Column1, Column2" _
, currentproject.connection, adOpenKeyset, adLockOptimistic
restart_:
c1 = rst(0)
c2 = rst(1)
rst.movenext
do while not rst.eof
if rst.fields(0) = c1 and rst.fields(1) = c2 then //duplicate
rst.delete
rst.requery
goto restart_
else
c1 = rst(0)
c2 = rst(1)
rst.movenext
end if
loop
我在删除操作中使用的语法可能不可靠(抱歉,我总是使用查询来执行删除操作)
【讨论】:
【参考方案2】:使用 distinct 获取所需的行并将它们插入到新表中。重命名旧表并将其替换为新表。
【讨论】:
感谢您的回复。不幸的是,这对我的目的不起作用。我刚刚在上面提到了这一点,但是这个表是附加到一个表单上的,所以每当新的重复项被导入到表中时,这个过程就必须不断地完成。我无法每次手动添加新表、传输数据和重命名它们。我想这就是你的意思,但如果我误解了你的想法,请告诉我。 不,你明白。我认为这是你需要做的一次性事情。另一个想法:将这两列设为主键,然后 Access 将不允许输入重复项。以上是关于如何删除 Access 表中的重复项(不使用查询)?的主要内容,如果未能解决你的问题,请参考以下文章