这不是this Q&A的重复,因为此处的问题和答案涉及FROM
子句中提到的表格。我的不是。
假设FROM
子句中的表总是相同的,我永远不会改变它。我添加联接的顺序是否重要?
我正在使用内部构建的查询构建器。 (是的我知道那里已经有了一些东西,但这个问题超出了范围)。
我希望能够在我的脚本开头设置一些连接,稍后根据条件设置一些连接,查询构建器会从上到下将它们添加到查询中。无论在查询中的顺序如何,SQL引擎都会优化连接的顺序吗?
示例:
SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A
INNER JOIN table2 B
ON B.a_id = A.id
LEFT JOIN table3 C
ON C.id = A.c_id
LEFT JOIN table4 D
ON D.id = C.d_id;
SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A
LEFT JOIN table4 D
ON D.id = C.d_id
INNER JOIN table2 B
ON B.a_id = A.id
LEFT JOIN table3 C
ON C.id = A.c_id;
在这里你可以看到我已经在连接之前为table4 D
声明了连接,因为它的依赖表是在脚本(C)
中声明的。这有关系吗?
答案 0 :(得分:2)
简单回答:不能在声明对象之前引用表对象/别名。
mySQL会在第二次查询时抛出错误。 `未知栏' C.d_id'在' on条款'
所以是的......编译器没有预见到它是否稍后被引用..它只知道订单然后它试图找出哪种加入方法最好。
*解决以下问题:无论如何,SQL引擎是否会优化连接的顺序,而不管它们在查询中的顺序如何? * 强>
是的,它会优化订单;但是" FROM"在声明表格或查询无法编译之前,订单不能包含对表格的引用。 (例如,参见上面的错误和链接)