我尝试执行以下查询,但它没有得到任何数据,尽管它应该得到一行:
select * from [DB1.table1] where col1 not in (select col2 from DB2.table2)
col1,col2 是 varchar 类型
为什么它不起作用?
我尝试执行以下查询,但它没有得到任何数据,尽管它应该得到一行:
select * from [DB1.table1] where col1 not in (select col2 from DB2.table2)
col1,col2 是 varchar 类型
为什么它不起作用?
“不起作用”并不能很好地描述您的问题,但在几乎所有情况下,这都是由子选择返回 NULL 值引起的。
你可能想要这个:
select * from [DB1.table1]
where col1 not in (select col2 from DB2.table2 where col2 is not null);
与NULL
总是产生“未定义”的比较,因此如果子选择中的至少一行NULL
在col2
列中包含 a ,则整个表达式为“未定义”。由于 undefined not "true",整个查询不返回任何内容。
如果你有NULL
s in 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)
如果这是您的情况的正确逻辑。
正如其他人已经指出导致此问题的原因一样,您可以获得相同的结果,使用它比带有vlauesLEFT JOIN
的谓词更安全:IN
NULL
select t1.*
from [DB1.table1] AS T1
LEFT JOIN DB2.table2 AS t2 ON t1.col1 = t2.col2
where t1.col2 IS NULL;