使用 CTE 进行递归查询的基本条件?

Base condition in recursive query using CTE?

WITH CTE 
AS(
SELECT ID,Name,ManagerID, 1 RecursiveCallNumber FROM Employee WHERE ID=2
UNION ALL
SELECT  E.ID,E.Name,E.ManagerID,RecursiveCallNumber+1 RecursiveCallNumber FROM Employee E
INNER JOIN CTE ON E.ManagerID=CTE.ID
)
SELECT * FROM CTE

以上代码在逻辑上是如何工作的?这是我的解释:

  1. 执行第一条select语句。 [现在临时table是 称为 CTE]

  2. 执行下一个select语句并与上面的结果合并。我们 加入减少递归中 steps/loops 的条件 在这种情况下是经理。 [现在整个事情被称为 CTE]

这里的基本条件是什么?如果连接中没有结果,那么它是一个基本条件吗?如果我们有第 0 个 IDN 记录形成循环引用,那不会中断吗?

https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx 是个好资源。

SQL 带有 CTE 的服务器中的递归定义不同于许多其他编程语言(例如函数式、命令式和逻辑语言)中的递归定义,因为 "base condition" 是开始,而不是结束,递归。

在大多数程序员熟悉的递归中,你首先询问你想知道什么(比如,"what's the factorial of five?"),然后你的递归程序逐渐将请求减少到简单的东西,到达基本情况("what's the factorial of one?"),并建立你的解决方案,因为它 "unwinds" 调用的递归链 ("factorial of three is three times the factorial of two, factorial of four is four times the factorial of three, and so on")。

在这里,您从 "seed data" 开始,然后继续扩展种子集,直到您发现更多东西可以添加到其中。一旦没有其他要添加的内容,您就会停止,然后 return 结果。

在某种意义上,这与使用队列的 breadth-first search 实现非常相似:您将初始元素添加到队列中,然后您的循环从队列中取出项目,并将其相关项目排入队列。一旦没有更多要添加的内容,循环就会停止。