假设有一张表(名为Example),它有一个主键字段(KeyID)和一个外键字段(ForeignID)。这个外键用于将我们表中的行与另一张表中的行/项链接起来,建立一对多的关系。然而,对于我们的许多行,不存在这样的关系,所以这些行的外键字段是
现在,如果我们有一个KeyID(例如123),那么获取包含所有具有匹配的ForeignID值的行的结果集的首选SQL语句是什么?
我天真地从以下SQL开始:
NULL
。现在,如果我们有一个KeyID(例如123),那么获取包含所有具有匹配的ForeignID值的行的结果集的首选SQL语句是什么?
我天真地从以下SQL开始:
SELECT E1.*
FROM Example E1
JOIN Example E2
ON E2.KeyID = 123
AND E2.ForeignID = E1.ForeignID
当我们的匹配键行在ForeignID中具有正常值时,这段代码运行得非常好。但是,如果ForeignID恰好为NULL
,它将失败(返回空值)。经过一些初步搜索,我现在明白了原因(在阅读了像这样的问题之后),但我还没有找到任何很好的解决方案来解决这个限制。
SQL Server提供了ANSI_NULLS
设置,可以更改该设置,但这似乎是一种肮脏的,潜在有问题的方式。
另外,我可以始终使用自己的伪空值(如0)并将其插入ForeignID列而不是NULL
,但这将破坏我为此列建立的外键约束。
那么,最好的方法是什么?