SQL:连接语法变体
我正在使用PostgreSQL,但我认为这个问题也适用于其他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是我的主键,在本例中缩写 我在注意到语法之前进行了测试。让我吃惊的是它居然奏效了 问题是:这是语法的适当变化吗?它是如何解释的?它是合法的,但并不常见
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代码>,这更正常。我得到了同样的结果。