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




