sql - 如何从具有相同表的外部 Access 数据库中更新表?
问题描述
通过 VBA 使用 MS Access,我一直在尝试从结构相同的外部 Access 数据库表中更新主 Access 数据库表。相同的列,相同的字段。外部数据库用于更新中央主数据库。
我一直在尝试开发的是一行 SQL,它只附加完全唯一的条目。因为没有可以引用的传入数据的外键或唯一标识符,所以我需要检查每个字段以确保没有完全相同的重复项。因此,如果表有 2 个字段,如果条目未通过逻辑测试,
intTable.field1 = extTable.field1 And intTable.field2 = extTable.field2
那么这些条目将被附加。
我想出的代码如下,当它运行时,它会尝试附加(以 Gary Oldman 的声音)一切。我无法找出它可能有什么问题,因为它几乎就像它忽略了WHERE
or 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)从您的字段比较逻辑中删除字符串引号。
Table1
2)您在查询中使用了别名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],"!@#")));
推荐阅读
- laravel - Laravel - 运行前获取队列数据
- python - Python 直方图绘图:- y 轴未针对大数组进行标准化
- node.js - 如何使用 EJS 模板提供 Webpack 包?
- c++ - tictactoe 游戏变量未在范围内声明
- python - ImportError:无法导入名称 qr_insert
- jquery - 如何从文件类型的输入中获取我上传的图像并使用 Jquery 将该图像添加到我的页面中
- android - 由于缺少 64 位库,无法构建 64 位版本的 Ionic Android App
- sql-server - 仅使用 T-SQL 等效的 SSIS 快速加载数据流任务?
- garbage-collection - Flink 中的垃圾收集器
- html - 溢出:隐藏阻止我向下滚动网页的其余部分