MySQL引用WITH定义的CTE提示当前库对应表不存在如何解决
问题原因及解决方案
原因1:MySQL版本不支持CTE
公共表表达式(WITH语法)是MySQL 8.0版本才新增的特性,如果你使用的是5.7及更早版本,MySQL无法识别CTE定义,会直接将listdates作为普通物理表去当前schema下查找,自然会抛出1146不存在的报错。
你可以执行以下命令确认当前MySQL版本:
SELECT VERSION();
如果版本低于8.0,有两种解决路径:
- 升级MySQL实例到8.0及以上版本
- 改写SQL,将递归生成日期的逻辑替换为临时表、日期辅助表或者派生表实现
原因2:版本符合要求时的语法调整
如果确认版本≥8.0仍报错,可按以下规则调整写法:
- 所有引用CTE名称的位置统一去掉反引号,避免MySQL错误解析为schema限定的物理表
- 递归CTE的递归引用部分保持和CTE名称完全一致
修改后的代码示例
CREATE VIEW `somthing.iii`.`vwCarSalesData` AS WITH listdates ( weekdate ) AS ( SELECT CONVERT(Now(3), DATE) AS DATE UNION ALL SELECT Timestampadd(day,-7,weekdate) FROM listdates WHERE weekdate > DATE_ADD(CONVERT(sysdate(3), DATE), INTERVAL 13*-7 day) ) SELECT Sum(CASE WHEN closedate > weekdate AND createddate <= weekdate THEN 1 ELSE 0 END) AS NumberOfDeals, Sum(CASE WHEN closedate > weekdate AND createddate <= weekdate THEN Round(Ifnull(amount,0),0) ELSE 0 END) AS PipelineValue, Sum(CASE WHEN closedate > weekdate AND createddate <= weekdate THEN Round(Ifnull(expectedrevenue,0),0) ELSE 0 END) AS ExpectedRevenue, c.id AS CategoryID, weekdate AS Added FROM `somthing.iii`.Ocars AS o CROSS JOIN listdates JOIN `somthing.iii`.`Categories` AS c ON o.category = c.NAME Where isclosed != 1 AND stagename != 'Cancelled' AND stagename != 'Closed Lost - N/A' GROUP BY weekdate, c.id
内容的提问来源于stack exchange,提问作者Goku
相关产品推荐
相关产品推荐

