代码之家  ›  专栏  ›  技术社区  ›  LazyBear

如何从具有相同表的外部访问数据库更新表?

  •  0
  • LazyBear  · 技术社区  · 6 年前

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

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

    我想出的代码在下面,当它运行时,它试图附加(加里·奥德曼的声音)一切。我不知道它有什么问题,因为它几乎忽略了 WHERE 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)) ));
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   ArcherBird    6 年前

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

    2)您有别名 Table1 在您的查询中作为 sourceDB ,所以使用那个引用。

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

    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 价值观,你不能做一个简单的 = 比较开始时间 无效的 不平等 无效的 . 我能想到的在MS Access中解决这个问题的最佳方法是替换 无效的 其他一些不可能使用的值。在执行此操作时,还需要确保选择的替换值与数据类型一致。我假设你所有的字段都是文本。

    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],"!@#")));
    
    推荐文章