gpt4 book ai didi

MySQL 递归 CTE 表不存在

转载 作者:行者123 更新时间:2023-11-29 07:19:12 25 4
gpt4 key购买 nike

我正在学习递归函数,因为我需要为几天范围内的每一天提取一行。这是我目前的数据

+----+------------+------------+
| id | from | to |
+----+------------+------------+
| 1 | 09-20-2019 | 09-25-2019 |
+----+------------+------------+

目标是按如下方式接收我的数据

+----+------------+
| id | date |
+----+------------+
| 1 | 09-20-2019 |
| 1 | 09-21-2019 |
| 1 | 09-22-2019 |
| 1 | 09-23-2019 |
| 1 | 09-24-2019 |
| 1 | 09-25-2019 |
+----+------------+

我正在按照此处看到的示例进行操作:https://stackoverflow.com/a/54538866/1731057但出于某种原因,我的递归函数正在寻找“cte”表。

Query 1 ERROR: Table 'project.cte' doesn't exist

WITH cte AS (
SELECT date_from
FROM event_dates
UNION ALL
SELECT DATE_ADD(event_dates.date_from, INTERVAL 1 DAY)
FROM cte
WHERE DATE_ADD(event_dates.date_from, INTERVAL 1 DAY) <= event_dates.date_until
)
select * FROM cte;

最佳答案

您的递归 CTE 结构不正确,联合的上半部分应该是种子基本情况。然后,递归部分应该在之前的传入值上加上一天:

WITH RECURSIVE cte (n, dt) AS (
SELECT 1, '2019-09-20'
UNION ALL
SELECT n + 1, TIMESTAMPADD(DAY, n, '2019-09-20') FROM cte WHERE n <= 5
)

SELECT * FROM cte;

enter image description here

Demo

值得注意的是,我们在这里使用 TIMESTAMPADD() 来解决 INTERVAL 表达式的问题,它不能真正接受变量。

如果您想使用这种方法生成一系列与表中的起始值和终止值相匹配的日期,那么您可以尝试连接:

SELECT
t1.dt
FROM cte t1
INNER JOIN yourTable t2
ON t1.dt BETWEEN t2.from_date AND t2.to_date;

以这种方式使用时,递归 CTE 充当日历表。

关于MySQL 递归 CTE 表不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57255049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com