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

时间:2011-02-15 21:14:32

标签: sql postgresql join ansi-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不支持关于连接顺序的优化器提示,并将尝试自动创建最佳查询计划。)

3 个答案:

答案 0 :(得分:15)

它是一样的,但它与隐式 CROSS JOINs一样模棱两可。使用显式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)

注意:

  • INNER JOINS和CROSS JOINS是可交换和关联的:顺序通常无关紧要。
  • OUTER JOINS不是,您确定了
  • SQL是声明性的:您告诉优化器您想要什么,而不是如何操作。这将删除JOIN订单注意事项(取决于前两个项目)

答案 1 :(得分:1)

情况总结在Controlling the Planner with Explicit JOIN Clauses。外连接不会重新排序,内连接可以。您可以通过在运行查询之前删除* join_collapse_limit *来强制执行特定的优化器顺序,并按照您希望的顺序放置内容。这就是你如何“暗示”这个领域的数据库。

通常,您希望使用EXPLAIN来确认您获得的订单,有时可以用来直观地确认两个查询是否获得相同的计划。

答案 2 :(得分:0)

我为驴子做了几年的SQL,根据我的经验,表格顺序并不重要。数据库将查看整个查询并创建最佳查询计划。这就是为什么数据库公司在查询计划优化中聘请了许多拥有博士学位的人。

如果数据库供应商按照您在查询中列出SQL的顺序进行优化,则会导致商业自杀。