【发布时间】:2016-03-13 13:57:28
【问题描述】:
我有 3 个表 - 表 1 和表 2 有记录,表 3 应该插入它们的差异。这是我现在拥有的:
SQL = "INSERT INTO Table3 (Field1,Field2)" & _
"SELECT Table2.Field1, Table2.Field2" & _
" FROM Table2 LEFT JOIN Table1 ON Table2.Field1 = Table1.Field1" & _
" OR Table2.Field2 = Table1.Field2" &_
" WHERE (((Table1.Field1) Is Null) OR ((Table1.Field2) Is Null))" & _
" AND NOT (Table2.Field1 IS NULL AND Table2.Field2 IS NULL)"
此查询成功在 Table3 中插入不匹配的记录,但是当我再次运行此查询并且不应再插入任何内容时,查询仍会在 Table3 中插入 1 条记录,其中 Table1 或 Table2 中的字段之一为 Null。
我怎样才能避免这种情况发生,缺陷在哪里?
编辑:这是表格中的示例....
Table1:
CompanyNo CompanyName
111 Microsoft
Apple
333 Oracle
Table2:
CompanyNo CompanyName
111 Microsoft
222 Apple
333 Oracle
Intel
555 Google
Then Table3 should result differences:
CompanyNo CompanyName
222 Apple
Intel
555 Google
并且在第一次运行代码时结果是正确的,但是当我再次运行它时,再次显示“Intel”记录 - 但它不应该因为 Table2 中的所有新数据都已经在 Table1 中(我正在执行 INSERT 和在此查询之后更新到 Table1,因此“Intel”记录已经在 Table1 中)。
【问题讨论】:
-
这可能与
JOIN ON子句中的OR有关。 -
是的,可能。但是我已经尝试了 AND、OR 和 ON、LEFT JOIN、INNER JOIN 的各种组合,并且无法在第二次运行时消除空插入。
-
我不清楚。再次运行追加查询将再次将相同数量的记录添加到表中。没有检查记录是否已经在表中。因此,如果它第一次附加 10 条记录,那么它将在第二次、第三次……时再次执行。我错过了什么吗?
-
解释起来有点复杂 - 但简而言之 - 在表 1 的查询之后使用了很多查询。但是对于这个查询:在执行查询之前,所有内容都从 Table3 中删除,所以不表中没有记录。此表用于显示在 Table1 中导入新数据时更改的数据,但问题是第二次运行代码,它在 Table3 中插入记录,其中空白字段已在 Table1 中,未更改。
-
哦,还有 Table2?那只是用于导入 Access,这样我就可以在不重复的情况下导入 Table1。这就是为什么要查询 Table2 - 它有所有新数据,而 Table1 有旧数据。而表 3 需要这两者之间的差异。