【发布时间】:2016-07-08 05:18:51
【问题描述】:
我已经使用它年了,所以现在是完全理解它的时候了。假设这样的查询:
SELECT
*
FROM a
LEFT JOIN b ON foo...
LEFT JOIN c ON bar...
documentation 告诉我们
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? (或者,是一样的吗?)
【问题讨论】:
-
两者都是,这取决于您如何连接数据(示例中的 foo 和 bar。例如,如果在语句“... JOIN c ON bar...”中,条件使用表 a 和 b,它将是 JOIN b ON foo。
-
(a left join b) left join c,即第一个a是左表,然后(a left join b)是下一个左表。 -
@jarlh 如果您将此作为答案并提供参考,我会接受。
-
考虑一下如果你的陈述都在一行上会是什么样子(不利于可读性,但只是为了理解这种情况)。当您使用
LEFT [OUTER] JOIN时,您要求它将表上的 all 行保留在此语句的 left (a),无论指定的下一个表 (b) 中是否有任何行与您的布尔表达式匹配。
标签: sql postgresql join outer-join