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

MariaDB 10.5中使用CTE查询出现语法错误,请求排查

问题原因与修复方案

你的问题核心在于**rank是MariaDB的保留关键字**——你在CTE里把DENSE_RANK()的结果命名为rank,后续查询引用这个别名时触发了语法错误。

为什么单独跑子查询没问题?

单独执行CTE内部的SELECT语句时,MariaDB对“用关键字做列别名”的校验比较宽松;但在完整的CTE查询结构中,引用这个关键字别名就会触发严格的语法检查,这就是报错的根源。

两种修复方法

方法1:更换为非关键字别名

把rank改成比如ranking这类普通名称:

WITH intervals AS (
    SELECT rom_opening_interval.start,
           rom_opening_interval.end,
           priority,
           DENSE_RANK() OVER (ORDER BY priority DESC) AS ranking
    FROM rom_opening_time
        INNER JOIN rom_opening_interval ON rom_opening_time.id = rom_opening_interval.opening_time_id
    WHERE rom_opening_time.start <= CURRENT_DATE
        AND (rom_opening_time.end >= CURRENT_DATE OR rom_opening_time.end IS NULL)
        AND days & 8 > 0
)
SELECT start, end, priority
FROM intervals
WHERE ranking = 1;

方法2:用反引号包裹关键字别名

如果一定要保留rank这个名称,给它加上反引号``,让MariaDB把它识别为普通标识符:

WITH intervals AS (
    SELECT rom_opening_interval.start,
           rom_opening_interval.end,
           priority,
           DENSE_RANK() OVER (ORDER BY priority DESC) AS `rank`
    FROM rom_opening_time
        INNER JOIN rom_opening_interval ON rom_opening_time.id = rom_opening_interval.opening_time_id
    WHERE rom_opening_time.start <= CURRENT_DATE
        AND (rom_opening_time.end >= CURRENT_DATE OR rom_opening_time.end IS NULL)
        AND days & 8 > 0
)
SELECT start, end, priority
FROM intervals
WHERE `rank` = 1;

关于测试CTE的说明

你提供的测试查询能正常运行,是因为没有使用保留关键字作为别名,所以不会触发语法校验问题。

内容的提问来源于stack exchange,提问作者Oliver Coors

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:25:07