Databricks SQL执行带Join的Update语句时触发ParseException异常求助
解决Delta表Update语句的ParseException错误
嘿,我来帮你搞定这个问题!你遇到的ParseException: mismatched input 'from' expecting <EOF>错误,核心原因是Spark SQL(Delta Lake基于Spark SQL实现)的UPDATE语法不支持传统关系型数据库(比如MySQL)里的UPDATE ... FROM ... JOIN写法。解析器在处理完SET子句后,预期语句直接结束(也就是<EOF>),但你后面跟了from,所以触发了这个匹配错误。
给你两个可行的解决方案,根据你的场景选就行:
方案1:用子查询实现单字段更新
如果你只是要更新ACP这一个字段,可以在SET里通过关联子查询拿到对应的值,调整后的SQL如下:
UPDATE views.test_acp_effect eff SET eff.ACP = ( SELECT ia.COSTVALUE FROM source_tables_db.ia_master_items ia WHERE eff.CODE = ia.IMM_CODE ) WHERE eff.DXN_Period = ( SELECT td.MY_FISCAL_PERIOD_ABBR FROM timedelta td WHERE current_date() BETWEEN td.MIN_P_DATE AND td.MAX_P_DATE ) -- 加上这个条件可以避免无匹配项的行被更新为NULL,不需要的话可以删掉 AND EXISTS ( SELECT 1 FROM source_tables_db.ia_master_items ia WHERE eff.CODE = ia.IMM_CODE )
方案2:使用MERGE INTO(更推荐关联更新场景)
如果以后还要做更复杂的关联更新,Delta Lake官方更推荐用MERGE INTO语法,逻辑更清晰,也更符合Delta的最佳实践:
MERGE INTO views.test_acp_effect eff USING ( -- 先把需要关联的数据源和条件整合到一个子查询里 SELECT ia.IMM_CODE, ia.COSTVALUE, td.MY_FISCAL_PERIOD_ABBR FROM source_tables_db.ia_master_items ia -- 关联当前日期对应的 fiscal period CROSS JOIN ( SELECT td.MY_FISCAL_PERIOD_ABBR FROM timedelta td WHERE current_date() BETWEEN td.MIN_P_DATE AND td.MAX_P_DATE ) td ) src -- 匹配目标表和源表的条件 ON eff.CODE = src.IMM_CODE AND eff.DXN_Period = src.MY_FISCAL_PERIOD_ABBR -- 匹配成功时执行更新 WHEN MATCHED THEN UPDATE SET eff.ACP = src.COSTVALUE
内容的提问来源于stack exchange,提问作者andreas9898
相关产品推荐
相关产品推荐

