想象一个表(名为Example),它有一个主键字段(KeyID)和一个外键字段(ForeignID)。此外键用于将表中的行链接到单独表中的外部行/项,从而建立多对一关系。但是,对于我们的许多行,不存在这样的关系,因此我们的外键字段在这些行中为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
,它将失败(不返回任何内容)。在做了一些初步搜索后,我现在明白了为什么(在阅读this one之类的问题之后),但我没有找到任何解决这个限制的好方法。
授权SQL Server具有我可以更改的ANSI_NULLS
设置,但这似乎是一个肮脏的,可能有问题的黑客。
或者,我总是可以组成自己的伪空值(如0)并将其粘贴在ForeignID列而不是NULL
中,但这会破坏我为此列建立的外键约束
那么如何最好地实现我的目标呢?
答案 0 :(得分:8)
未经测试,但我认为你可以这样做:
SELECT E1.*
FROM Example E1
JOIN Example E2
ON E2.KeyID = 123
AND (E2.ForeignID = E1.ForeignID
OR (E2.ForeignID IS NULL AND E1.ForeignID IS NULL))
编辑:Works,SQL Fiddle here
答案 1 :(得分:7)
SELECT E1.*
FROM Example E1
JOIN Example E2
ON E2.KeyID = 123
AND EXISTS (SELECT E2.ForeignID
INTERSECT
SELECT E1.ForeignID)