我有一个VBA脚本,它通过一个表来查找,该表是两个不同表(a
和b
)的联接,其中表(表)之间可能存在不匹配的字段a
是原始表,表b
是同一表,但是是新的导出文件)。
目标是找出哪些字段不同,并使用两个表(a
和b
)之间不匹配的字段列表更新共享字段中的一个字段。
但是一个领域没有通过测试。我尝试单独查询该表,以查看是否可以使用简单的SQL查询来确定Access是否能够识别出差异。
我无法理解为什么它不起作用,就像我以相同的方式尝试其他字段一样,它返回了预期的结果。我已经确认两个字段都是Short Text
数据类型,两个字段具有相同的“常规属性”,“查找属性”,并且“属性表”不仅在两个字段之间匹配,而且在所有其他相似的字段之间也匹配。
此查询:
SELECT [a_Address 2], [b_Address 2]
FROM Staging_LOG_ExportDifferences
WHERE ID = 18;
结果:
[a_Address 2] = (NULL)
[b_Address 2] = xasdf
但是当我尝试此查询时:
SELECT *
FROM Staging_LOG_ExportDifferences
WHERE [a_Address 2] <> [b_Address 2];
结果:
No results
答案 0 :(得分:0)
这是NULL
的语义。几乎每一次比较都会失败-或更准确地说,比较会返回NULL
,并将其与FALSE
一起过滤掉。
标准SQL具有NULL
-安全比较,IS DISTINCT FROM
。但是MS Access不支持。
因此,您可以明确地说:
SELECT *
FROM Staging_LOG_ExportDifferences
WHERE ([a_Address 2] <> [b_Address 2]) OR
([a_Address 2] IS NULL AND [b_Address 2] IS NOT NULL) OR
([a_Address 2] IS NOT NULL AND [b_Address 2] IS NULL) ;
答案 1 :(得分:0)
作为替代方案,您可以使用这种方法,从而避免在VBA中使用多个if语句:
SELECT [a_Address 2], [b_Address 2]
FROM Staging_LOG_ExportDifferences
WHERE Len(Nz([a_Address 2],"")) <> Len(Nz([b_Address 2],""))
答案 2 :(得分:0)
您可以使用此:
SELECT *
FROM Staging_LOG_ExportDifferences
WHERE Nz([a_Address 2],'') <> Nz([b_Address 2],'');
这假设您的地址不包含空字符串,或者至少出于比较目的,您认为空字符串与NULL
相等。我通常还会使用Trim
来确保任何键入错误的空格都不会引起问题:
Trim(Nz([a_Address 2],'')) <> Trim(Nz([b_Address 2],''))