WITH RECURSIVE date_range AS (
SELECT '2023-01-01'::timestamp AS date
UNION ALL
SELECT date + interval '1 day'
FROM date_range
WHERE date < '2023-12-31'
)
SELECT *
FROM date_range;
我可以理解如何创建这个查询,但不理解数据库引擎执行的底层逻辑/规则。 具体来说:对于
select date + 'interval 1 day' from date_range
:它怎么知道只“考虑”最后添加的记录[而不是获取所有先前添加的记录并为每个记录添加 1]?
为了更清楚地说明:考虑我们何时处于递归中的
2023-01-03
。在这种情况下,表中可能已经有 2023-01-01
、2023-01-02
和 2023-01-03
。为什么下面显示的第二个查询没有“找到” Three 记录并将 1 添加到这 3 条记录的all?
SELECT date + interval '1 day'
FROM date_range
WHERE date < '2023-12-31'
相反,引擎只“找到”最后一条记录。
2023-01-03
并加一以生成单个新记录2023-01-04
? 这只是我对recursive
观点的“信仰”吗?
来自@nbk指出的链接postgresql递归查询:关键步骤是这样的:
将工作表的内容替换为中间表的内容,然后清空中间表。
因此,对于问题中提到的查询,中间表显然只是新生成的结果[而不是先前由递归生成的任何其他结果]。