SQL内部联接空值

Ric*_*ico 37 sql sql-server null join

我加入了

SELECT * FROM Y
INNER JOIN X ON ISNULL(X.QID, 0) = ISNULL(y.QID, 0) 
Run Code Online (Sandbox Code Playgroud)

Isnull在像这样的加入使它变得缓慢.这就像有条件的加入.有什么工作可以解决这个问题吗?我有很多记录,其中QID是Null

任何人都有一个解决方案,不需要修改数据

Eva*_*oll 58

你有两个选择

INNER JOIN x
   ON x.qid = y.qid OR (x.qid IS NULL AND y.qid IS NULL)
Run Code Online (Sandbox Code Playgroud)

或者更容易

INNER JOIN x
  ON x.qid IS NOT DISTINCT FROM y.qid
Run Code Online (Sandbox Code Playgroud)

  • 我是否遗漏了某些内容,或者SQL Server中没有"IS NOT DISTINCT FROM"功能?根据我的发现,它可能会进入下一个版本,但它不在SQL Server 2008中. (5认同)
  • 瞬间!像它一样告诉它 (5认同)
  • -1那为什么这是投票和评分最高的答案?第一个选项似乎不起作用,因为我得到"多部分标识符"dbo.tbl_MyTable"无法绑定". (3认同)

Joh*_*nFx 7

您是否已承诺使用Inner join语法?

如果没有,您可以使用此替代语法:

SELECT * 
FROM Y,X
WHERE (X.QID=Y.QID) or (X.QUID is null and Y.QUID is null)
Run Code Online (Sandbox Code Playgroud)

  • 但是,使用此语法而不是接受的答案中的显式连接没有任何好处. (3认同)

小智 5

如果您希望从 Y.QID 中包含空值,那么最快的方法是

SELECT * FROM Y LEFT JOIN X ON y.QID = X.QID

注意:此解决方案仅适用于您需要左表中的空值,即 Y(在上述情况下)。

否则 INNER JOIN x ON x.qid IS NOT DISTINCT FROM y.qid 是正确的做法


Mar*_*ith 5

本文对此问题进行了很好的讨论.您可以使用

SELECT * 
FROM Y
INNER JOIN X ON EXISTS(SELECT X.QID 
                       INTERSECT 
                       SELECT y.QID);
Run Code Online (Sandbox Code Playgroud)