使用NOT IN的MS Access sql

时间:2018-02-06 17:46:55

标签: sql ms-access

我使用这两个表在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,因此两个查询都应该有效。任何人都可以解释为什么第一个查询不会返回任何内容吗?

4 个答案:

答案 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将转换为零或零长度字符串。