You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

MySQL 8.0.19中CTE查询报错,SQLite可正常运行的原因?

问题原因及解决方案

首先,你遇到的报错核心原因是MySQL版本兼容性问题

你的MySQL版本是8.0.19,而MySQL直到8.0.20版本才正式支持在CTE(公共表表达式)中直接使用VALUES()语法来构造行集。SQLite对这种语法的支持更早,所以你的查询在SQLite能正常运行,但在8.0.19的MySQL里会触发语法错误。

修复后的查询写法

针对你的场景,有两种可行的解决方式:

方式1:用UNION ALL替代VALUES构造行集

这是兼容MySQL 8.0.19及更早版本的写法:

WITH `vals` (`uid`, `cid`) AS (
    SELECT 816, 97 UNION ALL
    SELECT 1, 97 UNION ALL
    SELECT 754, 10
)
SELECT `t1`.`message_id`, `t1`.`channel_id`, `t1`.`user_id`, `t1`.`timestamp`
FROM `User_message` AS `t1`
INNER JOIN `vals` ON (`t1`.`user_id` = `vals`.`uid` AND `t1`.`channel_id` = `vals`.`cid`);

方式2:升级MySQL到8.0.20或更高版本

如果可以升级你的MySQL服务器到8.0.20及以上版本,你原来的查询语法就可以直接使用了——从这个版本开始,MySQL支持在CTE中使用VALUES()作为行构造器,和SQLite的语法对齐。

补充说明:在MySQL 8.0.20之前,VALUES()语法主要用于INSERT语句中,不能直接在CTE或者子查询中作为行集来源,这是它和SQLite的关键语法差异点。

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

火山引擎 最新活动