我试图了解递归CTE是如何执行的,特别是是什么原因导致它们终止。下面是一个简单的例子:
WITH cte_increment(n) AS (
SELECT -- Select 1
0
UNION ALL -- Union
SELECT -- Select 2
n + 1
FROM -- From
cte_increment
WHERE -- Where
n < 6
)
SELECT
*
FROM
cte_increment
;我目前的思维模式是,在调用表达式时,应按照以下顺序执行子句:
1
但是,我认为这种情况不可能发生,因为From子句递归地调用相同的表达式,这将重新启动同一进程,再深一级。这将导致无限递归,只有在达到递归限制时才会停止。
我的问题是,CTE如何检查其终止条件?
提前感谢您的帮助!
发布于 2020-12-11 20:15:38
因此,“递归”在这里有点用词不当。它实际上是迭代的,从锚定条件开始。也许更准确的术语是数学意义上的“归纳”。
每个迭代只使用上一次迭代中的行。它不使用CTE中的所有行。
因此,第一次迭代生成:
0第二个只看到1并生成
1第三个只看到2并生成
2等等,直到你到达where条件说“不再”的地方。
https://stackoverflow.com/questions/65257987
复制相似问题