一尘不染

联接语句的操作顺序

sql

鉴于以下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仍将返回。

它是如何工作的?


阅读 139

收藏
2021-03-17

共1个答案

一尘不染

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

所以首先t1 LEFT JOIN t2 ON t1.fk = t2.pk发生。此联接的结果是一个虚拟表,其中包含来自t1, t2和(因为它是左外部联接)的所有匹配t1行,并且所有不匹配的行也将保留为空,且这些t2列的值为空。

然后,该虚拟表将参与下一个联接。 JOIN t3 ON t2.fk = t3.pk

任何t2与行中不匹配的记录都不t1是第一阶段输出的虚拟表的一部分,因此不会出现在最终结果中。此外,该内部连接上t2.fk = t3.pk就会失去任何NULL的价值t2.fk有效地把你整个事情回内部联接。

Itzik Ben
Gan在这里
很好地解释了逻辑查询处理

2021-03-17