鉴于以下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仍将返回。
它是如何工作的?
ON子句的位置控制评估的 逻辑 顺序。
ON
所以首先t1 LEFT JOIN t2 ON t1.fk = t2.pk发生。此联接的结果是一个虚拟表,其中包含来自t1, t2和(因为它是左外部联接)的所有匹配t1行,并且所有不匹配的行也将保留为空,且这些t2列的值为空。
t1 LEFT JOIN t2 ON t1.fk = t2.pk
t1, t2
t1
t2
然后,该虚拟表将参与下一个联接。 JOIN t3 ON t2.fk = t3.pk
JOIN t3 ON t2.fk = t3.pk
任何t2与行中不匹配的记录都不t1是第一阶段输出的虚拟表的一部分,因此不会出现在最终结果中。此外,该内部连接上t2.fk = t3.pk就会失去任何NULL的价值t2.fk有效地把你整个事情回内部联接。
t2.fk = t3.pk
NULL
t2.fk
Itzik Ben Gan在这里很好地解释了逻辑查询处理