JOIN...ON...JOIN...ON 与 JOIN...JOIN...ON...ON 之间的区别

Mis*_*oto 5 sql database-agnostic

如果有的话,以下之间有什么区别?

FROM table1
LEFT JOIN table2 ON table1.key = table2.key
LEFT JOIN table3 ON table2.key = table3.key
Run Code Online (Sandbox Code Playgroud)

和:

FROM table1
LEFT JOIN table2
    LEFT JOIN table3
    ON table2.key = table3.key
ON table1.key = table2.key
Run Code Online (Sandbox Code Playgroud)

结果似乎是一样的。

由于有评论和答案说第二种语法无效,我将澄清 - SQL Server、PostgreSQL 和 MySQL 都可以很好地接受这两种变体。我还使用一个具有自己的 TSQL 实现的平台,该平台将其自己的实现转换为它实际连接到的提供程序之一,第二个变体是默认情况下它如何从可视化编辑器编写代码。

在第一个答案之后,我决定添加第二种类型的更复杂的示例:

SELECT table1.Name AS MainData, table3ParentParent.Name AS AdditionalData
FROM table1
LEFT JOIN table2
    JOIN table3
        JOIN table3 AS table3Parent
            JOIN table3 AS table3ParentParent
            ON table3Parent.Parent = table3ParentParent.key
        ON table3.Parent = table3Parent.key
    ON table2.table3_id = table3.key
ON table1.table2_id = table2.key
Run Code Online (Sandbox Code Playgroud)

我已将表的名称更改为无意义的,因为真正的表名称是俄语的,并且不会告诉您任何信息,但这是我现在正在处理的查询的一部分。另外,我想指出,我并不是在询问有关优化查询的建议,如果有人发现它不是最佳的,我只是想了解语法是否存在实际差异,或者只是表面上的差异。

Gor*_*off 3

第一个被评估为:

FROM (table1 LEFT JOIN
      table2
      ON table1.key = table2.key
     ) LEFT JOIN
     table3
     ON table2.key = table3.key
Run Code Online (Sandbox Code Playgroud)

第二个评估为:

FROM table1 LEFT JOIN
     (table2 LEFT JOIN
      table3
      ON table2.key = table3.key
     )
     ON table1.key = table2.key
Run Code Online (Sandbox Code Playgroud)

因此,首先评估和LEFT JOIN之间的值。在第一个查询中,第二个对其进行评估。table2table3

这有什么区别吗?在这种情况下,我认为没有什么区别。在一些其他的JOINs 组合中,在微妙的边缘条件下,排序可能会产生影响。