JOIN语法运行单个表引用(来自MySQL文档:https://dev.mysql.com/doc/refman/5.5/en/join.html):
table_reference JOIN table_factor ON condition
如果我在括号内放置多个表格引用并将其用作' table_reference'后面会发生什么?
(t1, t2, t3) JOIN (SELECT X FROM ... ) t4 ON (t4.X = t1.Y)
如果没有括号,我会收到错误:'未知栏' t1.Y'在条款'。这是有道理的,因为它只是尝试加入t3。但是,用括号表示它可以工作。
答案 0 :(得分:2)
如果你有这个表达式:
from t1,
t2,
t3 join
(select x. . . ) t4
on t4.X = t1.Y
然后将其解释为:
from t1,
t2,
(t3 join
(select x. . . ) t4
on t4.X = t1.Y
)
换句话说,join
在逗号之前完成,因为join
的优先级高于,
(如果您执行10 *,则获得11而不是30的原因相同) 2 + 1)。如果您将,
替换为看似等效的cross join
,那么查询就可以了:
from t1 cross join
t2 cross join
t3 join
(select x. . . ) t4
on t4.X = t1.Y
这是因为cross join
的优先规则与,
的优先规则不同。
括号告诉编译器"解释"的顺序。为了加入。所以,当你这样做时:
from (t1, t2, t3) join
(select X from ... ) t4 on (t4.X = t1.Y)
t1
中的列可用。
故事的寓意:不要在from
条款中使用逗号。始终使用显式连接,即使对于cross join
。