首页 > 解决方案 > 如何从具有相同表的外部 Access 数据库中更新表?

问题描述

通过 VBA 使用 MS Access,我一直在尝试从结构相同的外部 Access 数据库表中更新主 Access 数据库表。相同的列,相同的字段。外部数据库用于更新中央主数据库。

我一直在尝试开发的是一行 SQL,它只附加完全唯一的条目。因为没有可以引用的传入数据的外键或唯一标识符,所以我需要检查每个字段以确保没有完全相同的重复项。因此,如果表有 2 个字段,如果条目未通过逻辑测试,
intTable.field1 = extTable.field1 And intTable.field2 = extTable.field2
那么这些条目将被附加。

我想出的代码如下,当它运行时,它会尝试附加(以 Gary Oldman 的声音)一切。我无法找出它可能有什么问题,因为它几乎就像它忽略了WHEREor WHERE NOT EXIST。我已经尝试了几十个小的编辑和替代版本。要么追加全部,要么不追加。

INSERT INTO Table1 
SELECT field1, field2, field3, field4, field5
FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB 
WHERE NOT EXISTS (SELECT * 
                  FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB1 
                  WHERE ('Table1.[field1]'='sourceDB1.[field1]' And 
                         'Table1.[field2]'='sourceDB1.[field2]' And 
                         'Table1.[field3]'='sourceDB1.[field3]' And 
                         'Table1.[field4]'='sourceDB1.[field4]' And 
                         'Table1.[field5]'='sourceDB1.[field5]'));

最终代码(在实施 ArcherBird 的解决方案之后):

INSERT INTO Table1 
SELECT field1, field2, field3, field4, field5
FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB 
WHERE NOT EXISTS (SELECT * 
                  FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB1 
                  WHERE ((sourceDB.[field1] = sourceDB1.[field1] Or (sourceDB.[field1] IS NULL And sourceDB1.[field1] IS NULL)) And 
                         (sourceDB.[field2] = sourceDB1.[field2] Or (sourceDB.[field2] IS NULL And sourceDB1.[field2] IS NULL)) And 
                         (sourceDB.[field3] = sourceDB1.[field3] Or (sourceDB.[field3] IS NULL And sourceDB1.[field3] IS NULL)) And 
                         (sourceDB.[field4] = sourceDB1.[field4] Or (sourceDB.[field4] IS NULL And sourceDB1.[field4] IS NULL)) And 
                         (sourceDB.[field5] = sourceDB1.[field5] Or (sourceDB.[field5] IS NULL And sourceDB1.[field5] IS NULL)) ));

标签: sqlms-accessvba

解决方案


1)从您的字段比较逻辑中删​​除字符串引号。

Table12)您在查询中使用了别名sourceDB,因此请使用该参考。

3)您检查不存在的表应该是Table1(您要插入的那个)的“本地”版本。

INSERT INTO Table1 
SELECT field1, 
       field2, 
       field3, 
       field4, 
       field5
FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB
WHERE NOT EXISTS (SELECT * 
                  FROM [Table1] sourceDB1 
                  WHERE (sourceDB.[field1] = sourceDB1.[field1] And 
                         sourceDB.[field2] = sourceDB1.[field2] And 
                         sourceDB.[field3] = sourceDB1.[field3] And 
                         sourceDB.[field4] = sourceDB1.[field4] And 
                         sourceDB.[field5] = sourceDB1.[field5]));

编辑:

要处理这些字段可能有null值的情况,您不能进行简单的=比较,因为null不等于null。我能想到的在 MS Access 中解决此问题的最佳方法是null用其他一些不太可能使用的值替换。在这样做时,您还需要确保选择与数据类型一致的替换值。我将假设您的所有字段都是文本。

INSERT INTO Table1 
    SELECT field1, 
           field2, 
           field3, 
           field4, 
           field5
    FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB
    WHERE NOT EXISTS (SELECT * 
                      FROM [Table1] sourceDB1 
                      WHERE (nz(sourceDB.[field1],"!@#") = nz(sourceDB1.[field1],"!@#") And 
                             nz(sourceDB.[field2],"!@#") = nz(sourceDB1.[field2],"!@#") And 
                             nz(sourceDB.[field3],"!@#") = nz(sourceDB1.[field3],"!@#") And 
                             nz(sourceDB.[field4],"!@#") = nz(sourceDB1.[field4],"!@#") And 
                             nz(sourceDB.[field5],"!@#") = nz(sourceDB1.[field5],"!@#")));

推荐阅读