AlaSQL中LEFT JOIN使用表别名报错:MySQL正常查询为何失效
MySQL兼容查询在AlaSQL中执行失败的原因及解决办法
问题描述
以下查询在MySQL中可正常运行,但在AlaSQL(4.3.1和3.0.0版本)中执行失败:
SELECT DISTINCT any_event.*, temp.event_name AS parent_name FROM any_event LEFT JOIN any_event AS temp ON any_event.parent_id=temp.event_id WHERE any_event.event_id=3
AlaSQL返回的精简错误信息:
SELECT any_event.*, temp.event_name AS p --------------------^ Expecting 'LITERAL', 'BRALITERAL', 'LPAR', [.....] 'MINUS', 'ATLBRA', 'LCUR', got 'TEMP'
原因分析
AlaSQL的SQL解析器存在语法兼容性问题:当SELECT子句中先使用原表名.*的形式,紧接着引用带别名的表字段时,解析器无法正确识别别名表的合法引用,会误将别名(如这里的temp)判定为不符合语法规则的token,从而抛出解析错误。这种处理逻辑和MySQL的语法解析逻辑不一致,MySQL可以正常识别该语法。
解决方案
可以通过以下两种方式修复该查询,使其在AlaSQL中正常执行:
方式一:为主表添加别名,统一使用别名引用
给主表any_event设置别名,后续所有主表字段的引用都使用别名,避免原表名和别名表混合使用的情况:
SELECT DISTINCT ae.*, temp.event_name AS parent_name FROM any_event AS ae LEFT JOIN any_event AS temp ON ae.parent_id=temp.event_id WHERE ae.event_id=3
方式二:明确列出主表字段,避免使用*
放弃使用any_event.*的简写形式,直接列出需要查询的主表字段:
SELECT DISTINCT any_event.event_id, any_event.parent_id, any_event.event_name, temp.event_name AS parent_name FROM any_event LEFT JOIN any_event AS temp ON any_event.parent_id=temp.event_id WHERE any_event.event_id=3
内容的提问来源于stack exchange,提问作者Arne M
相关产品推荐
相关产品推荐

