如何删除Access表中的重复项(不使用查询)?

时间:2012-08-16 16:39:52

标签: sql ms-access access-vba ms-access-2007

为清楚起见,我的表中有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

有人问我为什么不尝试查询。答案是因为我正在使用链接到我的表的表单(通过多个中间查询)。在这个表单上,我必须能够输入数据并将其添加到我的表中。如果我使用查询删除重复项,查询和表之间的关系不再一对一,所以我将无法在表单中键入信息。

我希望这是有道理的,但如果没有,请告诉我,我会很乐意进一步阐述。

2 个答案:

答案 0 :(得分:0)

使用distinct来获取所需的行并将它们插入到新表中。重命名旧表并将其替换为新表。

答案 1 :(得分:0)

你需要使用一个记录集(因为你不能从你用查询指定的表结构中删除重复项,因为没有唯一的键来区分匹配的行,并得到一个你的必须创建一个新表):

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   

我使用的语法是删除操作可能是狡猾的(抱歉,我总是使用查询来删除)