我试图将我的查询从内部联接转换为直接联接。我的原始查询是:
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是否禁止使用直接连接?我在文档中没有看到它。
答案 0 :(得分:1)
我认为你可以在MySQL中使用NATURAL JOIN
,如
SELECT COUNT(*) FROM x AS t1 NATURAL JOIN x AS t2;
答案 1 :(得分:1)
引用reference manual for JOIN
syntax:
STRAIGHT_JOIN
与JOIN
类似,只是左表始终在右表之前读取。这可以用于连接优化器以错误顺序放置表的那些(少数)情况。
答案 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)