我正在使用PostgreSQL,但我认为这个问题也适用于其他SQL。
我正在编辑JOIN
子句,最后我得到了以下语法。
tableA JOIN tableB JOIN tableC ON tableB.fk = tableC.pk ON tableA.pk = tableB.fk;
也就是说,我有2个JOIN子句,后跟2个ON子句。字段fk
和pk
是我的主要密钥,在此示例中缩写。
我在注意到语法之前测试过。让我感到惊讶的是它有效。
问题是:语法是否正确变化,以及如何解释?
答案 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连接时它可以改变一些东西。