一尘不染

使用LEFT(外部)联接时,联接中表的顺序是否重要?

sql

我想确认SQL查询

SELECT ....
  FROM apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas
 WHERE ....

完全等同于FROM子句中的其他排列,例如

SELECT ....
  FROM oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
       bananas,
       apples
 WHERE ....

或者

SELECT ....
  FROM bananas,
       apples,
       oranges
       LEFT JOIN kiwis ON kiwis.orange_id = oranges.id
 WHERE ....

只要橙子和奇异果之间的显式LEFT JOIN保持不变即可。根据我在各种文档中所阅读的内容,返回的集合应该完全相同。

我真的只关心查询的结果,而不关心它在实际数据库中的性能。(我使用的是PostgreSQL
8.3,而AFAIK不支持有关连接顺序的优化程序提示,它将尝试自动创建最佳查询计划)。


阅读 172

收藏
2021-03-10

共1个答案

一尘不染

它是相同的,但是对于 隐式 CROSS JOINs来说,它与地狱是模棱两可的。使用显式联接。

如果要加入WHERE子句,则结果 可能会 有所不同,因为联接和过滤器混合在一起了。

SELECT ....
  FROM apples a
       JOIN
       bananas b ON ...
       JOIN 
       oranges o ON ...
       LEFT JOIN
       kiwis k ON k.orange_id = o.id
 WHERE (filters only)

笔记:

  • 内部联接和交叉联接是可交换的和关联的:顺序通常不重要。
  • 您确定的外部联接不是
  • SQL是声明性的:您告诉优化器您想要什么,而不是如何去做。这消除了JOIN订单注意事项(取决于前两个项目)
2021-03-10