为什么这个查询不起作用

Why doesn't this query work

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

这是我经常使用的查询,目前有效:

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

它return有 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

它 return455 行。

知道为什么第一个查询没有 return 任何行吗?

您在 FK_csi

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

查看 here 以获得解释。

当子查询具有 NULL 值时,

NOT IN 行为异常。在这种情况下,它 returns 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);

当然,你也可以像米海建议的那样显式添加wheref.FK_CSI = NULL`