为什么[NOT IN]语法不起作用?

时间:2013-03-28 07:39:24

标签: sql sql-server sql-server-2012

我尝试执行以下查询但它没有获得任何数据,尽管它应该得到一行:

select * from [DB1.table1] where col1 not in (select col2 from DB2.table2) 

col1,col2的类型为varchar

为什么它不起作用?

3 个答案:

答案 0 :(得分:5)

不起作用”并不完全是对您的问题的良好描述,但几乎在所有情况下,这都是由子选择返回NULL值引起的。

你可能想要这个:

select * from [DB1.table1] 
where col1 not in (select col2 from DB2.table2 where col2 is not null);

NULL的比较总是产生“未定义”,因此如果子选项中至少有一行在NULL列中包含col2,则整个表达式为“未定义” 。由于undefined不是“true”,整个​​查询不会返回任何内容。

答案 1 :(得分:1)

如果您NULL中的col2 table2 create table table2 ( col2 varchar(10) null ) insert into table2 (col2) values ('abc'),(null) create table table1 ( col1 varchar(10) null ) insert into table1 (col1) values ('abc'),('def') select * from table1 where col1 not in (select col2 from table2) ,您将获得您描述的行为:

NOT IN

不产生任何行。这是因为UNKNOWN比较发生后NULL的结果变为select * from table1 where col1 not in (select col2 from table2 where col2 is not null)

你可以用以下方法修复它:

{{1}}

如果这是你的情况的正确逻辑。

答案 2 :(得分:1)

正如其他人已经指出导致此问题的原因,您可以使用LEFT JOIN获得相同的结果,并且它比带有IN值的谓词NULL更安全:< / p>

select t1.* 
from [DB1.table1] AS T1 
LEFT JOIN  DB2.table2 AS t2 ON t1.col1 = t2.col2
where t1.col2 IS NULL;