【发布时间】:2016-03-14 03:44:02
【问题描述】:
就中间步骤和沿途涉及的工作/临时表而言,我无法理解递归 CTE 的工作原理。
稍微改编自PostgreSQL Documention的示例:
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 5
)
SELECT n FROM t;
在 Postgres (9.5) 中运行它,我得到:
n
---
1
2
3
4
5
(5 rows)
但是为什么我们没有得到更多的行呢?例如
SELECT n+1 FROM t WHERE n < 5
当n = 2时,为什么表t没有两行
---
1
2
并以此为基础生成
---
2
3
?
如果是这种情况,最终结果应该有许多重复值,例如 2 和 UNION ALL。
文档的相关部分对“工作表”和“中间表”进行了以下说明,尽管对我来说描述性不够清楚:
1.评估非递归项。 ...在递归查询的结果中包括所有剩余的行,并将它们放在一个临时的 工作台。
2.只要工作表不为空,重复以下步骤:
一个。计算递归项,代入当前内容 递归自引用的工作表。 ... 包括所有 递归查询结果中的剩余行,并且还放置 它们在一个临时中间表中。
b.将工作表的内容替换为 中间表,然后清空中间表。
我的问题是:
谁能逐步解释上面的简单示例发生了什么?
另外,我试图从编程的角度来理解这个递归 CTE。谁能勾勒出上述 CTE 中生成序列的算法的骨架?
【问题讨论】:
-
正是我想知道的东西谢谢!!
标签: postgresql recursion common-table-expression