我正在MS SQL Server(如果重要的是2016版)中运行以下查询。
SELECT DISTINCT Job_Number
FROM table_A
WHERE Job_Number IS NOT NULL
返回2376行
SELECT *
FROM table_A
WHERE Job_Number IN (SELECT DISTINCT [House Bill] FROM table_B)
返回137行
但是,
SELECT *
FROM table_A
WHERE Job_Number NOT IN (SELECT DISTINCT [House Bill] FROM table_B)`
返回0行。我希望这将返回2239行(即2376-137)。
在这里我还没有了解NOT IN的基本概念吗?
答案 0 :(得分:2)
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>xyz</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>
值,则 NOT IN
将无法返回结果:NULL
>
我的建议是将查询修改为:
(SELECT DISTINCT [House Bill] FROM table_B)
发生这种情况的原因是,每当在(SELECT DISTINCT [House Bill] FROM table_B WHERE [House Bill] IS NOT NULL)
中的一行与table_A
中的NULL
值之间进行比较时,逻辑结果就是table_B
。
有关此的更多信息:
1 - here 和
答案 1 :(得分:0)
IN()
子句将忽略NULL
值。
答案 2 :(得分:0)
可能的原因可能是null
列的tableb
中的[House Bill]
值:
正确的方法是使用NOT EXISTS
或EXISTS
而不是NOT IN
AND IN
子句:
SELECT a.*
FROM table_A a
WHERE NOT EXISTS (SELECT 1 FROM table_B b WHERE a.Job_Number = b.[House Bill]);
答案 3 :(得分:0)
NOT IN
如果子查询返回NULL
甚至根本不返回任何行。
因此,我强烈建议使用NOT EXISTS
。行为符合您的预期:
SELECT a.*
FROM table_A a
WHERE NOT EXISTS (SELECT 1 NFROM table_B b WHERE a.Job_Number = b.[House Bill])