为什么这个查询不起作用
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);
当然,你也可以像米海建议的那样显式添加where
f.FK_CSI = NULL`
有两个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);
当然,你也可以像米海建议的那样显式添加where
f.FK_CSI = NULL`