使用WITH子句的SQL查询在MySQL 5.7中报错,请问哪部分语法无效?
MySQL 5.7 CTE语法报错的解决方案
你碰到的问题其实很典型——MySQL 5.7并不支持WITH子句定义的公共表表达式(CTE),这个语法特性是MySQL 8.0才正式引入的。你开发环境能正常跑,应该是用了8.0及以上的版本,而生产环境的5.7不识别CTE语法,所以才会报出那个位置的语法错误。
要解决这个问题,只需要把原语句里的CTE转换成MySQL 5.7支持的子查询形式就行,逻辑完全不变,写法做个适配:
SELECT trader, cte2.price - cte1.price AS profit FROM (SELECT Sender AS trader, TokenAddress, TokenId, SUM(Price) AS price FROM OpenSeaTrade GROUP BY 1, 2, 3) AS cte1 JOIN (SELECT Receiver AS trader, TokenAddress, TokenId, SUM(Price) AS price FROM OpenSeaTrade GROUP BY 1, 2, 3) AS cte2 USING(trader, TokenAddress, TokenId) WHERE cte2.price - cte1.price > 1000000000000000000 ORDER BY profit LIMIT 5000
额外提两个小细节:
- 我给字段别名加上了
AS关键字(比如Sender AS trader),虽然MySQL允许省略,但显式写出能让语句可读性更强,也能避免某些边缘场景下的语法歧义。 - 如果后续生产环境有升级计划,建议把MySQL升到8.0及以上版本,这样就能直接使用CTE这种更简洁易读的写法了。
内容的提问来源于stack exchange,提问作者moccajoghurt
相关产品推荐
相关产品推荐

