MySQL是否允许使用直接连接的语法?

时间:2014-11-18 21:59:19

标签: mysql sql join rdbms

我试图将我的查询从内部联接转换为直接联接。我的原始查询是: SELECT COUNT(*) FROM x AS t1 INNER JOIN x AS t2 USING (id);我想简单地将内部联接替换为直接联接:SELECT COUNT(*) FROM x AS t1 STRAIGHT_JOIN x AS t2 USING (id);

第一个查询按预期执行,但第二个查询引发语法错误。如果我将查询更改为SELECT COUNT(*) FROM x AS t1 STRAIGHT_JOIN x AS t2 ON t1.id=t2.id

MySQL是否禁止使用直接连接?我在文档中没有看到它。

3 个答案:

答案 0 :(得分:1)

我认为你可以在MySQL中使用NATURAL JOIN,如

SELECT COUNT(*) FROM x AS t1 NATURAL JOIN x AS t2;

答案 1 :(得分:1)

引用reference manual for JOIN syntax

  

STRAIGHT_JOINJOIN类似,只是左表始终在右表之前读取。这可以用于连接优化器以错误顺序放置表的那些(少数)情况。

答案 2 :(得分:1)

是的,MySQL不允许直接加入USING。 http://dev.mysql.com/doc/refman/5.6/en/join.html中的语法规则显示了这一点:

join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor

join_condition:
    ON conditional_expr
  | USING (column_list)

您可以看到STRAIGHT_JOIN的语法只允许条件或ON子句。其他联接类型允许[join_condition]这是另一种扩展为ON子句或USING表达式的语法规则。

我不知道STRAIGHT_JOIN对这种不同的治疗是否有充分的理由。也许这只是一种疏忽。对于它的价值,这被报道为2008年的一个错误:http://bugs.mysql.com/bug.php?id=35268 但是没有对这种差异的解释,也没有迹象表明它有任何优先权来解决。

作为一种变通方法,您可以将STRAIGHT_JOIN查询修饰符应用于整个查询,然后使用标准JOIN运算符:

SELECT STRAIGHT_JOIN COUNT(*) FROM x AS t1 INNER JOIN x AS t2 USING (id)