当表引用包含在括号中时(在JOIN前面)会发生什么?

时间:2014-03-11 16:36:58

标签: mysql sql

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。但是,用括号表示它可以工作。

1 个答案:

答案 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