给出以下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仍然会被返回。
它是如何运作的?
答案 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