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吗?(或者,它是一样的吗?)
甲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无论连接类型如何,子句的解析都是相同的.