NOT IN返回意外结果

时间:2018-10-12 11:51:58

标签: sql sql-server tsql

我正在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的基本概念吗?

4 个答案:

答案 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

2 - here

答案 1 :(得分:0)

IN()子句将忽略NULL值。

答案 2 :(得分:0)

可能的原因可能是null列的tableb中的[House Bill]值:

正确的方法是使用NOT EXISTSEXISTS而不是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])