加入声明操作顺序

时间:2012-09-29 19:57:17

标签: sql sql-server tsql join left-join

给出以下3种方式加入

select t1.* from t1
left join t2 on t1.fk = t2.pk
join t3 on t2.fk = t3.pk

如果t2和t3之间的连接失败,是否会返回t1和t2之间成功连接的行?如果操作顺序从左到右,我假设没有,但如果从右到左进行评估(t3首先连接到t2),那么即使前者失败,t1仍然会被返回。

它是如何运作的?

1 个答案:

答案 0 :(得分:40)

ON子句的位置控制着逻辑评估顺序。

首先发生t1 LEFT JOIN t2 ON t1.fk = t2.pk。此连接的结果是一个虚拟表,其中包含来自t1, t2的所有匹配行和(因为它是左外连接),任何不匹配的t1行也会保留为{{1的空值列。

然后,此虚拟表将参与下一个联接。 t2

JOIN t3 ON t2.fk = t3.pk中的行不匹配的任何t2记录不属于第一阶段的虚拟表输出,因此不会出现在最终结果中。此外,t1上的此内部联接将失去t2.fk = t3.pk的任何NULL值,从而有效地将您的整个内容重新转换为内部联接。

逻辑查询处理很好地解释了by Itzik Ben Gan here