3

想象一个表(名为 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。在做了一些初步搜索之后,我现在明白了原因(在阅读了这样问题之后),但我还没有找到任何好的解决方案来解决这个限制。

授予 SQL Server 具有ANSI_NULLS我可以更改的设置,但这似乎是一个肮脏的、可能有问题的 hack。

或者,我总是可以制作自己的伪空值(如 0)并将其粘贴在 ForeignID 列而不是NULL,但这会破坏我为此列建立的外键约束。

那么如何最好地实现我想要的呢?

4

2 回答 2

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))

编辑:作品,这里的 SQL Fiddle

于 2013-04-09T20:28:31.350 回答
7

你也可以做

SELECT E1.*
FROM   Example E1
       JOIN Example E2
         ON E2.KeyID = 123
            AND EXISTS (SELECT E2.ForeignID
                        INTERSECT
                        SELECT E1.ForeignID) 
于 2013-04-09T20:31:02.047 回答