我使用这两个表在MS Access 2013中工作。
t1: t2:
ID ID F1 F2
1 a a
2 1 b a
3 2 b a
我知道这不是最理想的方法,但我写了这个查询来提取另一个表中不存在的所有ID。
Select [ID] from table1 WHERE [ID] NOT IN (SELECT ID FROM table2)
查询应该返回3,但由于某种原因,这个表没有给我任何结果。当我将查询更改为此时,它会给我3个结果。
Select [ID] from table1 WHERE [ID] NOT IN (SELECT [ID] FROM table2 WHERE [ID] IS NOT NULL)
我不确定为什么第二个查询工作原理的逻辑,但第一个查询没有返回任何结果。当我运行嵌套查询(SELECT [ID] FROM table2)时,它不会为任一查询返回3,因此两个查询都应该有效。任何人都可以解释为什么第一个查询不会返回任何内容吗?
答案 0 :(得分:3)
我强烈建议您忘记在子查询中使用not in
。相反,请使用not exists
:
Select [ID]
from table1 as t1
where NOT EXISTS (SELECT 1 FROM table2 as t2 WHERE t2.id = t1.id);
如您所知,当子查询返回not in
时,NULL
具有错误的语义(即行为)。只需使用NOT EXISTS
,而不是尝试使其工作。另外一个好处是,它可以很容易地扩展到多个列,并且如果可用的话应该使用索引。
答案 1 :(得分:1)
Null
值,因此当查询尝试查看3
=
是null
还是threadID := dllCall("GetWindowThreadProcessId", "uint", active_hwnd)
时,它还不知道如何检查它不会返回任何东西。
答案 2 :(得分:1)
这是因为在这个问题的答案中详细阐述了In作品(当然还有Not In):SQL "select where not in subquery" returns no results
答案 3 :(得分:0)
如果您坚持使用NOT IN,请使用此(假设在表2中ID不能为负):
Select ID
from table1
WHERE ID
NOT IN
(
SELECT Nz(ID,-1)
FROM table2
)
Nz将Null值转换为提供的参数。如果未提供参数,则Nz将转换为零或零长度字符串。