SQL使用修改后字段为关联键JOIN表时报b.buser不存在错误如何解决
错误原因
- SQL执行优先级中,
ON关联条件的执行顺序早于SELECT字段声明步骤,你在SELECT中通过left(b.username,11) as buser定义的别名,无法在同语句的ON子句中被识别 - 你关联的b表本身没有原生的
buser字段,直接调用b.buser自然会报字段不存在的错误 - 额外语法问题:你的
SELECT语句中b.email,末尾多了冗余逗号,也会触发语法报错
修复方案
方案1:直接把计算逻辑写到关联条件中(最简便)
直接在ON子句里写计算规则,不需要依赖别名,修改后SQL如下:
SELECT a.name, a.work_id, a.email_id, a.Legal_name, b.username, left(b.username,11) as buser, b.email FROM a LEFT JOIN b ON a.work_id = left(b.username,11)
方案2:提前计算b表的buser字段再关联(适合需要多次复用buser的场景)
先通过CTE/子查询把b表的buser字段提前计算出来,再和a表关联:
WITH b_calc AS ( SELECT *, left(username,11) as buser FROM b ) SELECT a.name, a.work_id, a.email_id, a.Legal_name, b_calc.username, b_calc.buser, b_calc.email FROM a LEFT JOIN b_calc ON a.work_id = b_calc.buser
内容的提问来源于stack exchange,提问作者msulol
相关产品推荐
相关产品推荐

