Sql 如何从具有相同表的外部Access数据库更新表?
使用MS Access,通过VBA,我一直在尝试从结构相同的外部Access数据库表更新主Access数据库表。相同的列,相同的字段。外部数据库用于更新中央主数据库 我一直在尝试开发一行SQL,它只附加完全唯一的条目。因为传入数据没有外键或唯一标识符可以引用,所以我需要检查每个字段以确保没有完全重复的字段。因此,如果表有2个字段,如果条目未通过逻辑测试 intTable.field1=extTable.field1和intTable.field2=extTable.field2 然后,这些是将要附加的条目 下面是我编写的代码,当它运行时,它试图在Gary Oldman语音中附加所有内容。我无法找出它有什么问题,因为它几乎忽略了哪里或哪里不存在。我尝试了几十个小的编辑和替代版本。is附加全部或无Sql 如何从具有相同表的外部Access数据库更新表?,sql,ms-access,vba,Sql,Ms Access,Vba,使用MS Access,通过VBA,我一直在尝试从结构相同的外部Access数据库表更新主Access数据库表。相同的列,相同的字段。外部数据库用于更新中央主数据库 我一直在尝试开发一行SQL,它只附加完全唯一的条目。因为传入数据没有外键或唯一标识符可以引用,所以我需要检查每个字段以确保没有完全重复的字段。因此,如果表有2个字段,如果条目未通过逻辑测试 intTable.field1=extTable.field1和intTable.field2=extTable.field2 然后,这些是将要
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从字段比较逻辑中删除字符串引号 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值的情况,不能进行简单的=比较,因为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],"!@#")));
不存在的将永远不会返回true,因为这些引号不是Access中的字段分隔符,而是字符串分隔符。只要从该查询中删除所有引号,它可能会正常运行。@ErikVonasMath当我删除引号时,Access会提示我输入参数值。我最初有这个问题,解决方案ELSHERE将单引号表示为修复,因为字段的数据类型是文本。我认为WHERE子句中的Table1引用应该是sourceDB,因为这是FROM子句中的别名。这再加上删除引号应该可以解决这个问题。好的,部分解决。现在,在我的测试数据库中,它追加了1579条记录中的304条。我想应该只有4个。外部数据库的其余部分是当前数据库的完全复制和粘贴,但我添加了4个唯一的测试条目。出于某种原因,它将其中的300个条目读取为唯一的。即使我多次运行该查询,它仍会继续提取这300个条目。我的意思是,虽然它们在运行之前可能不会被视为重复项,即使它们是重复项,但它们肯定应该在它插入确切的条目之后被视为重复项。@LazyBear我愿意打赌,这300条记录在其中一个比较字段中有空值。Null=Null将始终返回false;这意味着notexists将永远不会将其视为重复值。您需要执行某种类型的空替换/检查来处理这些情况。我将更新我的答案,并提出处理该案件的建议,就这样!非常感谢。我使用了以下内容来进行分类:sourceDB.[field1]=sourceDB1.[field1]或sourceDB.[field1]为NULL,sourceDB1.[field1]为NULL我直到现在才看到您的代码,只是注释。但是这两种方法似乎都有效。很好,我更喜欢你的解决方案——IsNull检查。很高兴帮助了@LazyBear