1

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

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

col1,col2 是 varchar 类型

为什么它不起作用?

4

3 回答 3

5

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

你可能想要这个:

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

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

于 2013-03-28T07:43:27.760 回答
1

如果你有NULLs in col2table2你会得到你描述的行为:

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就变成了。UNKNOWNNULL

您可以使用以下方法修复它:

select * from table1 where col1 not in (select col2 from table2 where col2 is not null)

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

于 2013-03-28T07:44:57.607 回答
1

正如其他人已经指出导致此问题的原因一样,您可以获得相同的结果,使用它比带有vlauesLEFT JOIN的谓词更安全:INNULL

select t1.* 
from [DB1.table1] AS T1 
LEFT JOIN  DB2.table2 AS t2 ON t1.col1 = t2.col2
where t1.col2 IS NULL;
于 2013-03-28T07:46:54.397 回答