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
上述代码如何在逻辑上起作用?这是我的解释:
执行第一个select语句。 [现在临时表是 称为CTE]
执行下一个select语句并加入上述结果。我们 加入一个减少递归中的步骤/循环的条件 在这种情况下是经理。 [现在整个事情被称为 CTE]
这里的基本条件是什么?如果连接中没有结果,那么它是一个基本条件?如果我们有第0个IDN记录形成循环引用,那会不会中断?
https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx是一个很好的资源。
答案 0 :(得分:1)
在大多数程序员熟悉的递归中,你首先询问你想知道什么(比如,"什么是5的阶乘?"),然后你的递归程序逐渐减少了请求简单地说,进入基本情况("什么是一个因素?"),并建立你的解决方案,因为它"展开"递归的调用链("三阶因子是两个阶乘的三倍,四阶因子是三阶因子的四倍,依此类推")。
在这里,您从种子数据"开始,然后通过扩展种子集继续进行,只要您可以发现要添加的更多内容。一旦没有别的东西可以添加,你就停下来,然后返回结果。
从某种意义上说,这与使用队列的breadth-first search实现非常相似:您将初始元素添加到队列中,然后您的循环从队列中获取项目,并将其相关项目排入队列。一旦没有其他东西可以添加,循环就会停止。