You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语法规则调整子句顺序,同时补全缺失的语法要素:

  1. 将LEFT JOIN块整体移动到主表FROM子句之后,删除主表后提前写的冗余WHERE块
  2. 给主表、关联子查询分别设置短别名简化书写
  3. 给子查询中的聚合结果设置别名,补全聚合所需的GROUP BY子句
  4. 所有同名字段添加表别名前缀,过滤条件统一放在全语句末尾的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:48:18