递归 CTE 如何知道只处理上次迭代期间添加的记录 [而不查看所有记录]?

问题描述 投票:0回答:1

考虑使用递归 CTE 生成一系列数据

中的这个[很好]示例
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
观点的“信仰”吗?

sql postgresql recursion
1个回答
0
投票

来自@nbk指出的链接postgresql递归查询:关键步骤是这样的:

将工作表的内容替换为中间表的内容,然后清空中间表。

因此,对于问题中提到的查询,中间表显然只是新生成的结果[而不是先前由递归生成的任何其他结果]。

© www.soinside.com 2019 - 2024. All rights reserved.