多个LEFT JOIN - 什么是"左"表?

vek*_*tor 8 sql postgresql join outer-join

多年来我一直在使用它,所以现在是时候充分理解它了.假设一个这样的查询:

SELECT 
  *
FROM a
LEFT JOIN b ON foo...
LEFT JOIN c ON bar...
Run Code Online (Sandbox Code Playgroud)

文件告诉我们,

T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression

LEFT OUTER JOIN

首先,执行内连接.然后,对于T1中不满足与T2中的任何行的连接条件的每一行,在T2的列中添加具有空值的连接行.因此,对于T1中的每一行,连接表始终至少有一行.

问题很简单:T1在这种情况下是什么?是a吗?或者是a LEFT JOIN b ON foo吗?(或者,它是一样的吗?)

Gor*_*off 5

FROM条款解析从左至右(除非由括号覆盖)的条件.所以:

FROM a 
LEFT JOIN b
     ON foo... 
LEFT JOIN c
     ON bar...
Run Code Online (Sandbox Code Playgroud)

被解析为:

FROM (
        a 
        LEFT JOIN b
           ON foo...
     ) 
LEFT JOIN c
     ON bar...
Run Code Online (Sandbox Code Playgroud)

这一点在该条款部分的文档中进行了解释:join-typeFROM

必要时使用括号来确定嵌套的顺序.在没有括号的情况下,JOINs窝从左到右.在任何情况下,JOIN 绑定比逗号分隔FROM-list项更紧密.

因此,一系列LEFT JOINs将所有记录保存在第一个提到的表中.这是一种方便.

请注意,FROM无论连接类型如何,子句的解析都是相同的.