T-SQL:JOIN与WHERE子句的附加谓词

Nei*_*ell 7 sql t-sql

在JOIN语句上添加其他谓词与在WHERE语句中将它们添加为附加子句之间有什么区别吗?

示例1:WHERE子句的谓词

select emp.*
from Employee emp
left join Order o on emp.Id = o.EmployeeId
where o.Cancelled = 0
Run Code Online (Sandbox Code Playgroud)

示例2:JOIN语句的谓词

select emp.*
from Employee emp
left join Order o on emp.Id = o.EmployeeId and o.Cancelled = 0
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 9

使用第一个语句,由于WHERE条件,外连接有效地转换为内连接,因为它将过滤掉没有找到订单的employee表中的所有行(因为o.Cancelled将为NULL)

所以这两个陈述没有做同样的事情.


Nei*_*ell 4

我已经从一些同事那里得到了答案,但如果他们没有在这里发布,我会自己添加一个答案。

这两个示例都假设谓词正在将“右”表上的列与标量值进行比较。

性能
似乎如果谓词在 上JOIN,那么“正确的”表会被提前过滤。如果谓词是WHERE子句的一部分,则所有结果都会返回,并在返回结果集之前在最后过滤一次。


如果谓词是子句的一部分返回的数据WHERE,那么在“正确”值为空(即没有连接行)的情况下,则整个行将不会在最终结果集中返回,因为谓词将比较值null,因此返回 false。

  • 如果只想返回存在相应“右”行的记录,则应使用 JOIN(或 INNER JOIN 以使用完整语法)。使用 LEFT JOIN 会向读取查询的人发送冲突的消息,并且不清楚查询应该做什么。 (3认同)