这个T-SQL是什么时候变得不正确的?还是一直如此?

这个T-SQL是什么时候变得不正确的?还是一直如此?,sql,sql-server,tsql,Sql,Sql Server,Tsql,为什么以下(最后两个)语句返回不同的结果。我几乎100%确信它们“使用”返回相同的结果(有人记得在SQLServer6/2000中是如何使用的吗?) 为空检查仅适用于根本没有匹配的成员颜色的颜色 如果任何membercolor匹配,则结果集如下: color blue memberid 8 color blue memberid 9 color blue memberid 10 应用where子句过滤掉所有蓝色行: memberid IS NULL OR b.memberid=11 如果没有

为什么以下(最后两个)语句返回不同的结果。我几乎100%确信它们“使用”返回相同的结果(有人记得在SQLServer6/2000中是如何使用的吗?)


为空
检查仅适用于根本没有匹配的
成员颜色
颜色

如果任何
membercolor
匹配,则结果集如下:

color blue memberid 8
color blue memberid 9
color blue memberid 10
应用
where
子句过滤掉所有蓝色行:

memberid IS NULL OR b.memberid=11
如果没有匹配的
membercolor
,则结果集如下所示:

color blue memberid NULL
where
子句将允许此过程通过。

始终是这样(至少从2000年起)-要了解原因,请检查以下其他语句:

SELECT * FROM color a LEFT JOIN membercolor b 
    ON a.colorid=b.colorid 
另一方面,您可能打算:

SELECT * FROM color a LEFT JOIN membercolor b 
    ON a.colorid=b.colorid AND b.memberid=11 WHERE b.memberid IS NULL OR b.memberid=11

将FROM子句视为处理的一个单独部分,而不是WHERE子句(从标准的角度来看,每个产品都必须假装是WHERE子句)

在左联接期间,系统将从左表中获取每一行,并尝试在右表中查找匹配项。如果存在匹配项,则它将在输出中为右表中的每个匹配行生成一行。如果没有匹配项,那么它将生成一行,右表中的所有列都设置为NULL

在您的第一个查询中,确实发生了这种情况。但在第二个查询中,在FROM子句处理过程中,它设法生成一个与连接条件匹配的行:

3   Blue      10    3
因此,它从不为右表中的那些列生成具有空值的行

现在,当处理WHERE子句时,您的条件将从最终结果集中排除此行


正如其他人所说,您可能还记得ANSI之前的连接语法,这可能会产生令人惊讶的结果。

您确定这不仅仅适用于旧式连接语法吗?我不记得了,但我非常确定它应该有效。毕竟-在左连接场景中,应该返回颜色中的所有行。过滤正确的表允许空值或一个值,所以我仍在努力掌握下面的答案…谢谢大家!我终于明白了:)要理解这一点,首先必须运行不带WHERE子句的查询,然后应用WHERE条件。如果没有WHERE子句,您将看到memberID列中没有一个结果是空的。啊,我终于明白了!在第二种情况下,左连接找到另一个members行,这将填充连接条件。然后WHERE子句将其过滤掉!非常感谢。
3   Blue      10    3