mysql - JOIN 语句中的多个 "ON"如何工作

标签 mysql sql

我当前正在读取一个在连接表时在其他一些查询中通常不会看到的查询。

SELECT 
    *
FROM table_1 
    RIGHT OUTER JOIN table_2 
    INNER JOIN table_3 
        ON table_2.some_id = table_3.some_id
    RIGHT OUTER JOIN table_4 
        ON table_3.some_id = table_4.some_id 
    LEFT OUTER JOIN table_5 
        ON table_4.some_id = table_5.some_id 
        ON table_1.some_id = table_4.some_id

请不要介意这些表是如何连接的。我只是想知道这个查询是如何工作的?预先感谢您。

最佳答案

我认为 SQL Server 文档比 MySQL 更好地捕捉到了正在发生的事情。 ( Here 是文档。)

正如劳伦斯所观察到的,这是一个解析问题。您可以通过查看 from 的语法图来了解它是什么。陈述。有一个大多数人(包括我)从未考虑过的递归引用。连接表具有以下语法:

<joined_table> ::= 
{
    <table_source> <join_type> <table_source> ON <search_condition> 
    | <table_source> CROSS JOIN <table_source> 
    | left_table_source { CROSS | OUTER } APPLY right_table_source 
    | [ ( ] <joined_table> [ ) ] 
}

这里的关键是第一 block ,<table_source> <join_type> <table_source> 。好吧,你猜怎么着,一个 table_source可以是joined_table (以及一堆其他的东西)。这意味着语法:

A join B join C ON <condition1> ON <condition2>

符合上面的语法,解释为:

A join (B join C on <condition1>) ON <condition2>

即表达式 B join C on <condition1>被视为“table_source”。

我的猜测是,如果 SQL Server 和 MySQL 都这样做,那么它可能是标准的一部分。然而,该标准比 SQL Server 的语法图更难理解。

关于mysql - JOIN 语句中的多个 "ON"如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759986/

相关文章:

MySQL用外键关系计算SUM

mysql - SQL - 排序依据然后分组依据

mysql - 如何从 wordpress docker 建立数据库连接

MySQL 连接/子查询,其中结果由外部表的多个值过滤

mysql - 如何在不使用循环的情况下将多行连接成单个文本字符串?

mysql - 如何编写查询以从 SQLite/MySQL 检索最后更新的行?

基于条件的 SQL 查询

mysql - 如何解构 COUNT()?

php - Yii2:如何在model->save()之后执行sql查询

php - 连接 Php、html 和 mysql