SQL:连接语法变体

SQL:连接语法变体,sql,postgresql,join,Sql,Postgresql,Join,我正在使用PostgreSQL,但我认为这个问题也适用于其他SQL 我正在编辑一个JOIN子句,最后得到了以下语法 tableA JOIN tableB JOIN tableC ON tableB.fk = tableC.pk ON tableA.pk = tableB.fk; 也就是说,我有两个JOIN子句,后面跟着两个ON子句。字段fk和pk是我的主键,在本例中缩写 我在注意到语法之前进行了测试。让我吃惊的是它居然奏效了 问题是:这是语法的适当变化吗?它是如何解释的?它是合法的,但并不常见

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

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

tableA JOIN tableB JOIN tableC ON tableB.fk = tableC.pk ON tableA.pk = tableB.fk;
也就是说,我有两个JOIN子句,后面跟着两个ON子句。字段
fk
pk
是我的主键,在本例中缩写

我在注意到语法之前进行了测试。让我吃惊的是它居然奏效了


问题是:这是语法的适当变化吗?它是如何解释的?

它是合法的,但并不常见

要解释它,从内到外工作。首先计算
tableB连接tableC
,并在表达式上使用第一个
。这很有帮助,因为这一部分本身就有意义:

tableB JOIN tableC ON tableB.fk = tableC.pk
然后,该表达式中的整个结果集将成为外部联接表达式的第二项/右侧,这将为您提供:

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

需要记住的一点是,如果任何记录都是由第一个/内部表达式过滤的,则外部表达式根本不考虑这些记录。在这个例子中,它没有什么区别,但是当涉及到外部连接时,它可以改变事情。

它是合法的,但并不常见

要解释它,从内到外工作。首先计算
tableB连接tableC
,并在
表达式上使用第一个
。这很有帮助,因为这一部分本身就有意义:

tableB JOIN tableC ON tableB.fk = tableC.pk
然后,该表达式中的整个结果集将成为外部联接表达式的第二项/右侧,这将为您提供:

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

需要记住的一点是,如果任何记录都是由第一个/内部表达式过滤的,则外部表达式根本不考虑这些记录。在本例中,它没有什么区别,但当涉及外部联接时,它可以改变情况。

您所写的内容是正确的。您也可以将其编写为:

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

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

您所写的内容是正确的。您也可以将其编写为:

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

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

谢谢。这是我的猜测,但我没有这种特殊形式的经验。这肯定不是我写的:它发生在我有一个旧视图反向工程的时候。为了证实这一点,我将
FROM
子句重新组织如下:
FROM tableA JOIN tableA.pk=tableB.fk JOIN tableB.fk=tableC.pk,这更正常。我得到了同样的结果。谢谢。这是我的猜测,但我没有这种特殊形式的经验。这肯定不是我写的:它发生在我有一个旧视图反向工程的时候。为了证实这一点,我将
FROM
子句重新组织如下:
FROM tableA JOIN tableA.pk=tableB.fk JOIN tableB.fk=tableC.pk,这更正常。我得到了同样的结果。