我尝试执行以下查询但它没有获得任何数据,尽管它应该得到一行:
select * from [DB1.table1] where col1 not in (select col2 from DB2.table2)
col1,col2的类型为varchar
为什么它不起作用?
答案 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;