【发布时间】:2019-02-15 17:49:09
【问题描述】:
我正在重构一些工作中的 sql,偶然发现了一些我不知道如何解释的东西。我认为有两个查询会产生相同的结果,但结果并非如此,而且我不确定为什么。
查询如下:
select *
from TableA as a
left join TableB b on a.id = b.id and b.status in (10, 100)
select *
from TableA as a
left join TableB b on a.id = b.id
where b.status is null or b.status in (10, 100)
这些什么时候不会返回相同的结果?
【问题讨论】:
-
由于您在 2;nd 查询中有
is null条件,它们将返回相同的结果。 -
@jarlh 我也这么认为,但他们没有。
-
在第二个查询中试试
where b.id is null or b.status in (10, 100),和第一个一样吗? -
糟糕,现在我明白了。你应该改用
where b.id is null ...。 -
您的问题主要归结为在
ON子句中过滤status或在WHERE子句中过滤。显然,在后一种情况下,您往往会丢失更多记录。IS NULL检查没有做任何你打算做的事情;但它也允许匹配的记录恰好具有NULL状态传递到结果集。
标签: sql sql-server tsql join outer-join