使用VBA/SQL比较Access中的所有字段

3

我知道我可以比较两个表之间的值,但到目前为止我没有需要比较超过2或3个字段,因此每个字段单独比较并不成问题,我使用了如下代码:

DoCmd.RunSQL "INSERT INTO Issues 
            SELECT Eligibility.[Member Id]
                 , Eligibility.[Sex Code]
                 , Eligibility.State 
            FROM Eligibility LEFT JOIN Ref 
            ON Eligibility.[Sex Code] = Ref.[Sex Code] 
            WHERE (((Ref.[Sex Code]) Is Null));"

现在,我需要比较大约140个不同的字段。有没有比编写140个SQL语句并逐个运行它们更好的方法?

我希望它可以找到字段中不包含相同信息的地方,然后从两个表中提取整行数据,或者至少是第5列成员ID的值,然后我可以运行另一个查询来从该值中提取整行数据(这样我就可以同时查看两个数据库),并将它们粘贴到另一个表中,并突出显示不匹配的单元格。

这两个表位于同一个数据库中。 这两个表具有相同的结构,但第二个表可能没有第一个表中的所有值,因此我需要找到一种在开始比较行之前基于成员ID匹配行的方法。

1个回答

1
您可以很容易地使用 DAO 进行比较。使用记录集上的 .Fields() 参数,您可以获得实际记录集中的所有不同字段。
这使您可以进行以下操作:
Sub exampleSQLComparison()

    Dim rs1 As DAO.Recordset
    Dim rs2 As DAO.Recordset

    '.... set those recordsets via SQL statements

    For Each f In rs1.Fields
        If rs1.Fields(f) <> rs2.Fields(f) Then
            Debug.Print "Mismatch found for " + f
        End If

    Next f

End Sub

如果您的查询类似,唯一需要更改的是单个字段(例如ID),那么您应该能够相应地修改逻辑。

如果我理解正确的话,DAO.Recordset基本上是在说rs1是一个表中所有字段的数组?我不需要告诉它“f”是一个值=任何和所有字段吗?抱歉,我刚接触VBA和SQL,所以我正在试图边学边弄清楚。 - user1787114
对于rs1.Fields中的每个字段,For Each f In rs1.Fields会逐一遍历其所有字段名。你需要在每条记录中检查这些字段名,并查看它们是否出现在iff语句中,以此来判断是否相同。 - enderland
它只是检查实际字段名称还是该字段内的值? - user1787114
@user1787114 它使用所有字段的列表来检查字段值。 - enderland
太好了,谢谢!除了它显示某些原因导致字段不在表中之外,我已经全部搞定了?我得再调试一下,到目前为止,我还没有弄清楚为什么它似乎忽略了存在的东西。 - user1787114
这在2003年数据库版本中对我并不起作用。但是,我所做的是在比较中使用if rs1.fields(f.sourcefield) <> rs2.fields(f.sourcefield)。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接