为什么这个查询不起作用

时间:2015-01-13 13:12:59

标签: sql sql-server notin

有两个表,两个表只有一列。 delete_DimCSI有196194行,delete_FRO有195740行。我正在寻找delete_DimCSI表中但不存在于delete_FRO表中的行。

这是我经常使用的查询,到目前为止一直有效:

select PK_CSI from delete_DimCSI
where PK_CSI not in (select FK_CSI from delete_FRO)

返回0行。

然后我创建了这个:

select PK_CSI, FK_CSI from delete_DimCSI
LEFT OUTER JOIN delete_FRO FRO on FK_CSI = PK_CSI
where FK_CSI is null

它返回455行。

知道第一个查询为什么不返回任何行?

2 个答案:

答案 0 :(得分:3)

NULL

中可能有FK_csi
select PK_CSI from delete_DimCSI
where PK_CSI not in (select FK_CSI from delete_FRO WHERE FK_CSI IS NOT NULL)

查看here以获得解释。

答案 1 :(得分:1)

当子查询具有NOT IN值时,

NULL表现得很奇怪。在这种情况下,它返回NULL或false - 两者都不被视为true。

出于这个原因,我建议使用NOT EXISTS而不是NOT IN。语义更符合您的期望:

select PK_CSI
from delete_DimCSI d
where not exists (select 1 from delete_FRO f where f.FK_CSI = d.PK_CSI);

当然,你也可以像Mihai建议的那样添加一个明确的where f.FK_CSI = NULL`。