使用WITH AS+ROW_NUMBER()取部门Top2用户报错,求原因
问题原因分析
你的WITH AS写法报错主要有两个可能的原因,核心原因是MySQL版本限制:
1. MySQL版本不支持CTE(WITH AS)语法
MySQL在8.0版本及以后才正式支持公共表表达式(CTE,即WITH AS语法)。如果你的MySQL服务器版本低于8.0,使用WITH AS会直接触发1064语法错误——因为低版本MySQL根本无法识别这个语法结构。而子查询是MySQL全版本支持的写法,所以能正常执行。
你可以执行以下语句查看当前MySQL版本:
SELECT VERSION();
2. 字段别名的引号使用问题(次要因素)
你给ROW_NUMBER()结果设置的别名是'row_number'(单引号包裹),在MySQL中,单引号通常用于表示字符串字面量,而非标识符(比如字段名、别名)。虽然子查询中MySQL能兼容这种写法,但在CTE上下文里可能会干扰语法解析。建议改用反引号()包裹别名,或者直接省略引号(因为row_number`不是MySQL关键字):
WITH temp_user AS ( SELECT * ,ROW_NUMBER() over (partition by departmentName order by failureTime desc ) as row_number from user ) SELECT * from temp_user where row_number <= 2
不过这个问题通常不是报错的主因,核心还是版本支持问题。
内容的提问来源于stack exchange,提问作者Ants-double
相关产品推荐
相关产品推荐

