首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JOIN...ON...JOIN...ON与JOIN...JOIN...ON...ON的区别

JOIN...ON...JOIN...ON与JOIN...JOIN...ON...ON的区别
EN

Stack Overflow用户
提问于 2018-08-06 11:28:56
回答 2查看 549关注 0票数 4

如果有的话,下面的区别是什么?

代码语言:javascript
复制
FROM table1
LEFT JOIN table2 ON table1.key = table2.key
LEFT JOIN table3 ON table2.key = table3.key

以及:

代码语言:javascript
复制
FROM table1
LEFT JOIN table2
    LEFT JOIN table3
    ON table2.key = table3.key
ON table1.key = table2.key

结果似乎是一样的。

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

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

代码语言:javascript
复制
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

我已经将表的名称更改为无意义的,因为真正的表是俄文的,而且无论如何也不会告诉您任何事情,但这是我现在处理的一个查询的一部分。另外,我要指出的是,我并不是在征求关于优化查询的建议,如果有人发现查询不是最优的,我希望了解语法是否有实际差异,或者仅仅是宇宙间的差异。

EN

回答 2

Stack Overflow用户

发布于 2018-08-07 10:13:35

在某些数据库中,联接表达式的“语法”被递归地定义为()。以下是简化的例子:

MySQL

代码语言:javascript
复制
join_table:
    table_reference [INNER|CROSS] JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition


table_reference:
    table_factor
  | join_table


table_factor:
    tbl_name

SQL Server

代码语言:javascript
复制
<joined_table> ::=
{
    <table_source> <join_type> <table_source> ON <search_condition>
    | <table_source> CROSS JOIN <table_source>
}


<table_source> ::=
{
    table_or_view_name
    | <joined_table>
}


<join_type> ::=
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } ] JOIN

这意味着根据语法,以下内容是完全有效的:

代码语言:javascript
复制
FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t2.key = t3.key ON t1.key = t2.key

语法还解释说,上述查询与以下内容相同:

代码语言:javascript
复制
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.key = t3.key) ON t1.key = t2.key

您可以根据上述信息将复杂查询转换为简单查询。以下查询:

代码语言:javascript
复制
SELECT *
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

可以写成:

代码语言:javascript
复制
SELECT *
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

展开括号后,从内部开始,得到以下内容(注意左转右):

代码语言:javascript
复制
SELECT *
FROM table3 AS table3Parent
JOIN table3 AS table3ParentParent ON table3Parent.Parent = table3ParentParent.key
JOIN table3 ON table3.Parent = table3Parent.key
JOIN table2 ON table2.table3_id = table3.key
RIGHT JOIN table1 ON table1.table2_id = table2.key
票数 4
EN

Stack Overflow用户

发布于 2018-08-06 13:43:40

第一项评价为:

代码语言:javascript
复制
FROM (table1 LEFT JOIN
      table2
      ON table1.key = table2.key
     ) LEFT JOIN
     table3
     ON table2.key = table3.key

第二项评价为:

代码语言:javascript
复制
FROM table1 LEFT JOIN
     (table2 LEFT JOIN
      table3
      ON table2.key = table3.key
     )
     ON table1.key = table2.key

因此,首先对table2table3之间的table3进行评估。在第一个查询中,它被计算为第二个。

这有什么区别吗?在这种情况下,我不认为有什么不同。在微妙的边缘条件下,还有其他一些JOIN的组合,在这些组合中,排序可以产生不同的效果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51706600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档