我当前正在读取一个在连接表时在其他一些查询中通常不会看到的查询。
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/