SQL:JOIN语法变体

时间:2017-04-26 03:54:18

标签: sql postgresql join

我正在使用PostgreSQL,但我认为这个问题也适用于其他SQL。

我正在编辑JOIN子句,最后我得到了以下语法。

tableA JOIN tableB JOIN tableC ON tableB.fk = tableC.pk ON tableA.pk = tableB.fk;

也就是说,我有2个JOIN子句,后跟2个ON子句。字段fkpk是我的主要密钥,在此示例中缩写。

我在注意到语法之前测试过。让我感到惊讶的是它有效。

问题是:语法是否正确变化,以及如何解释?

2 个答案:

答案 0 :(得分:3)

你所写的是正确的。你也可以把它写成:

tableA JOIN tableB ON tableA.pk = tableB.fk JOIN tableC ON tableB.fk = tableC.pk

两个查询都给出了相同的结果:)

答案 1 :(得分:2)

这是合法的,但不常见。

要解释它,从内到外工作。首先评估tableB JOIN tableC,然后使用第一个ON表达式。它有所帮助,因为这部分本身就是有意义的:

tableB JOIN tableC ON tableB.fk = tableC.pk

该表达式中的整个结果集然后成为外连接表达式的第二项/右侧,为您提供:

tableA JOIN (previous expression) ON tableA.pk = tableB.fk

要记住的一件事是,如果任何记录被第一个/内部表达式过滤掉,那么外部表达式根本不会考虑它们。它在这个例子中没有任何区别,但是当涉及OUTER连接时它可以改变一些东西。