SQL LEFT JOIN报错 Expected end of input but got keyword LEFT
错误产生原因
报错Syntax error: Expected end of input but got keyword LEFT at [14:1]的核心触发原因是SQL子句书写顺序不符合BigQuery语法规范,同时代码还存在其他几处会触发后续报错的问题:
- 子句顺序颠倒:标准SQL的固定书写顺序为
SELECT → FROM → [JOIN 关联表 ON 关联条件] → WHERE → GROUP BY → HAVING → ORDER BY,你在主表v_orders的FROM子句后直接写了WHERE过滤块,解析器读到这部分时会判定单表查询语句已经完整,后续出现的LEFT JOIN属于语法外的多余内容,因此抛出"期望输入结束但遇到LEFT关键字"的错误,报错指向的14行1位正好是LEFT JOIN的起始位置,完全匹配该问题特征。 - JOIN子查询缺少别名:LEFT JOIN后跟随的子查询没有定义别名,后续ON条件中直接写原表名
v_purch会无法识别对应字段。 - 子查询聚合语法不完整:子查询中使用了聚合函数
SUM(PURCH_QTY)但未指定列别名,且缺少对应GROUP BY子句,执行时会触发聚合错误。 - 重复定义WHERE子句:全段代码先后写了两个WHERE块,SQL语法不支持JOIN前后拆分写多个WHERE,会触发解析错误。
- 同名字段无归属标识:两张关联表都存在
DATE_ID、PROD_ID等同名字段,关联、过滤时不指定字段所属表会触发字段歧义报错。
修复方案
按照SQL语法规则调整子句顺序,同时补全缺失的语法要素:
- 将LEFT JOIN块整体移动到主表FROM子句之后,删除主表后提前写的冗余WHERE块
- 给主表、关联子查询分别设置短别名简化书写
- 给子查询中的聚合结果设置别名,补全聚合所需的GROUP BY子句
- 所有同名字段添加表别名前缀,过滤条件统一放在全语句末尾的WHERE块中
修复后的可正常执行的参考代码如下:
SELECT o.PROD_ID, o.OUTLET_ID, o.ORDER_NO, o.DATE_ID_DLVRY, o.ORDER_QTY, o.ORDER_QTY_BOOKED, o.ORDER_POS_STATUS, p.TOTAL_PURCH_QTY, p.BOOKING_DATE_ID, p.ORD_NO FROM `v135-5203-bq-td-sync.epviews.v_orders` o LEFT JOIN ( SELECT OUTLET_ID, PROD_ID, ORD_NO, BOOKING_DATE_ID, SUM(PURCH_QTY) AS TOTAL_PURCH_QTY, DATE_ID FROM `v135-5203-bq-td-sync.epviews.v_purch` GROUP BY OUTLET_ID, PROD_ID, ORD_NO, BOOKING_DATE_ID, DATE_ID ) p ON o.DATE_ID = p.DATE_ID WHERE o.DATE_ID BETWEEN "2021-10-01" AND "2021-10-03"
注:当前关联条件仅使用DATE_ID匹配,如果业务上需要按OUTLET_ID、PROD_ID等字段更精准关联,可以直接在ON子句后追加对应关联规则即可。
内容的提问来源于stack exchange,提问作者Benji
相关产品推荐
相关产品推荐

