MySQL 尝试在 WITH 语句期间使用当前模式

MySQL trying to use current schema during WITH statement

我在注释行下方显示了一个问题,我在使用 WITH 语句时无法使用“CTE”table(常见的 table 表达式)。

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
--error happens as this crossjoin, it is still trying to use the schema table named somthing.listdates
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

我有一个名为“somthing.iii”的架构,它尝试使用此架构来查找 table,而不是使用“WITH”语句中列出的故事。我试过删除 ` 字符,但这没有任何区别。

错误代码:1146。Table 'somthing.iii.listdates' 不存在

Fiddle

MySQL 需要一个自引用递归 WITH 子句项来使用 RECURSIVE 关键字(有一个例外,如 fiddle 所示),如下所示:

WITH RECURSIVE cte (lev) AS (
       SELECT 1 UNION ALL
       SELECT lev+1 FROM cte WHERE lev < 6
     )
SELECT * FROM cte
;

如果没有该关键字,对 cte 标识符的引用将由存储在数据库中的对象解析。如果找不到该对象,我们会看到此 doesn't exist 错误。

MySQL 有一个例外。如果该自引用 CTE 术语未在后续查询表达式中使用,则未检测到未解析的自引用并且不会出现错误,如 fiddle.

中所示

示例如下:

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 123 FROM dual
;

此处未检测到错误,MySQL。然而,MariaDB 确实将此检测为错误。

在原始问题中,不是 CROSS JOIN listdates 导致错误,而是 listdates 中对 listdates 的引用] 常见 table 表达式。

更改以下内容:

WITH `listdates` ( weekdate ) AS (

至:

WITH RECURSIVE `listdates` ( weekdate ) AS (