sql如何处理多个LEFT JOINS

时间:2015-04-15 07:49:10

标签: sql sql-server left-join

我没有特别的问题,所以我希望我的问题是有效的。我想了解有关LEFT JOIN的更多信息。

我知道LEFT JOIN会将左边的表格列与右边的表格相匹配。

FROM logs LEFT JOIN logins on logins.login_id = logs.user_id
LEFT JOIN city on logs.city_id = cities.city_id
LEFT JOIN factory on logs.factory_id = factory.factory_id
LEFT JOIN storage on logs.storage_id = storage.storage_id

SQL处理这个特定的顺序。请概述正在发生的事情。

感谢。

只是补充一点:我对只有一个LEFT JOIN会发生什么会有信心,但不确定在最后添加更多LEFT JOIN时会发生什么。我假设在虚拟现实中,SQL服务器将执行第一个LEFT JOIN,返回结果,然后在下一个LEFT JOIN中使用该结果,等等。

2 个答案:

答案 0 :(得分:3)

数据库引擎维护查询的连接顺序。

说那个

 1)A left join B left Join C is not same as 
 2)A left join C left join B

In 1) A is joined to B first and then joined to C
   2) A is joined to C first and then joined to C

注意:上述内容在语义上是正确的。数据库引擎可以选择任何其他连接顺序来优化查询,同时按照语义保持正确的结果。因此,在某些数据库引擎中,查询计划看起来会让您感到困惑。

答案 1 :(得分:0)

有两种方法可以回答这个问题:

  1. 如果您将所有表格和结果视为"数据集"并且只关注最终结果,然后是的,您可以将第一个连接的结果视为另一个集合,然后用于将下一个集合连接到它,依此类推。当您想要确定正确的结果集时,这是考虑它的正确方法。

  2. 在内部,服务器必须构建一个算法(也称为执行计划),它实际上用于从表中获取物理数据。服务器当然必须保证你使用方法1提出的END结果集没有改变,但可以随意重新排列查找和连接的顺序。在实践中,这将经常发生,特别是当您考虑某些操作可能能够在不同的处理器上并行运行时。例如,服务器可能决定在某个时刻执行OUTER JOIN而不是LEFT JOIN,并在以后或最后正确过滤结果,如果它确定这将产生较少的结果努力。

  3. 简而言之:SQL是一种语言,您可以在其中指定要获取的内容,并保留一些关于"如何执行的自由"到数据库。