MySQL使用LEFT JOIN多表联查触发1064语法错误问题咨询
问题解答
1. 报错的触发原因
错误SQL中LEFT JOIN x1后没有紧跟对应的ON关联条件,不符合MySQL的JOIN语法要求,因此触发1064语法错误。
2. 该写法返回语法错误的原因
SQL语法规范要求:每一个LEFT JOIN/RIGHT JOIN(外连接)都必须和自身的ON子句配对,用于定义外连接两张表的匹配规则。
报错的写法将x1、x3两张表的关联条件统一放到了最后JOIN x3的ON子句中,导致LEFT JOIN x1缺少必填的配对ON,因此语法校验不通过。
删除left关键字后,所有连接都是INNER JOIN(JOIN默认就是INNER JOIN),MySQL支持连续多个INNER JOIN后置统一写所有关联条件的语法糖,因此修改后可以正常运行。
3. 连接类型引发语法错误的原因
不同连接类型的语法约束不同:
INNER JOIN的关联条件可以后置合并,甚至省略(省略时返回笛卡尔积),语法灵活度更高- 外连接(
LEFT/RIGHT/FULL JOIN)的ON子句是强制必填项,既不能省略,也不能和其他连接的ON子句合并后置,必须紧跟在当前关联的表之后
写法中使用了LEFT JOIN但没有遵守它的专属语法约束,因此会触发语法错误。
正确写法参考
如果要实现x2左连x1,再关联x3的逻辑,调整如下即可正常运行:
select x2.c from x2 left join x1 on x1.a=x2.c join x3 on x3.b=x2.d;
如果业务逻辑是x2左连x1和x3的关联结果,可以用括号包裹关联逻辑:
select x2.c from x2 left join ( x1 join x3 on x1.a = x2.c and x3.b = x2.d ) on 1=1; -- 此处ON可根据实际匹配规则修改
内容的提问来源于stack exchange,提问作者101is5
相关产品推荐
相关产品推荐

