在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)
使用第一个语句,由于WHERE条件,外连接有效地转换为内连接,因为它将过滤掉没有找到订单的employee表中的所有行(因为o.Cancelled将为NULL)
所以这两个陈述没有做同样的事情.
我已经从一些同事那里得到了答案,但如果他们没有在这里发布,我会自己添加一个答案。
这两个示例都假设谓词正在将“右”表上的列与标量值进行比较。
性能
似乎如果谓词在 上JOIN,那么“正确的”表会被提前过滤。如果谓词是WHERE子句的一部分,则所有结果都会返回,并在返回结果集之前在最后过滤一次。
如果谓词是子句的一部分返回的数据WHERE,那么在“正确”值为空(即没有连接行)的情况下,则整个行将不会在最终结果集中返回,因为谓词将比较值null,因此返回 false。