MySQL报'with在当前位置无效' 看似语法正确的问题排查
报错根本成因
- 版本兼容性断层:MySQL 8.0 之前的版本完全不支持WITH语法定义的公共表表达式(CTE),只要语句以with开头执行,就会直接抛出“with在当前位置无效”的报错,很多人对照通用SQL语法检查时,会忽略自身所用数据库的版本支持边界。
- 语句本身存在明确语法硬伤,即便在支持CTE的高版本MySQL上执行也无法通过解析:
- 冗余逗号打断语法结构:你在
emp_cust AS (...)的闭合括号后额外加了逗号,这个逗号的作用是分隔同个WITH语句下的多个连续CTE定义,后面没有接第二个CTE定义就直接写SELECT查询,语法位置完全错乱。 - CTE引用规则错误:查询时写的
from emp_cust.id是无效写法,CTE的引用规则和普通业务表完全一致,直接写CTE的注册名称即可,不存在把字段名拼在表名后用.连接的用法。
- 冗余逗号打断语法结构:你在
对应修正方案
根据实际运行的MySQL版本选择对应处理方式:
- 若使用MySQL 8.0及以上版本(支持原生CTE语法)
直接删掉冗余逗号、修正CTE的引用方式即可,调整后可正常执行的SQL为:WITH emp_cust(id,f_name,l_name) AS ( SELECT c.ID, c.first_name, c.last_name FROM customer c, employee e WHERE c.first_name = e.first_name AND c.last_name = e.last_name AND c.email = e.email ) SELECT * FROM emp_cust; - 若使用低于MySQL 8.0的版本(不支持CTE语法)
把原CTE逻辑替换为FROM子句中的内嵌子查询,效果和CTE完全一致,改写后的可执行SQL为:SELECT * FROM ( SELECT c.ID, c.first_name, c.last_name FROM customer c, employee e WHERE c.first_name = e.first_name AND c.last_name = e.last_name AND c.email = e.email ) AS emp_cust;
内容的提问来源于stack exchange,提问作者user12468082
相关产品推荐
相关产品推荐

