有两个表,两个表只有一列。
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行。
知道第一个查询为什么不返回任何行?
答案 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`。