使用 CTE 进行递归查询的基本条件?
Posted
技术标签:
【中文标题】使用 CTE 进行递归查询的基本条件?【英文标题】:Base condition in recursive query using CTE? 【发布时间】:2015-03-10 14:35:50 【问题描述】: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
上面的代码在逻辑上是如何工作的?这是我的解释:
执行第一条选择语句。 [现在临时表是 称为 CTE]
执行下一个 select 语句并与上述结果连接。我们 加入一个减少递归步骤/循环的条件 在这种情况下是经理。 [现在整个事情被称为 CTE]
这里的基本条件是什么?如果连接中没有结果,那么它是一个基本条件吗?如果我们有第 0 条 IDN 记录形成循环引用,这不会中断吗?
https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx 是一个很好的资源。
【问题讨论】:
基本条件是不涉及 CTE 的条件。那将是第一个子查询。 【参考方案1】:具有 CTE 的 SQL Server 中的递归定义与许多其他编程语言(例如函数式、命令式和逻辑语言)中的递归定义不同,因为“基本条件”是递归的开始,而不是结束。
在大多数程序员熟悉的递归中,您首先询问您想知道什么(例如,“5 的阶乘是多少?”),然后您的递归程序逐渐将请求简化为简单的东西,到达基本情况( “一的阶乘是什么?”),并在“展开”递归调用链时构建您的解决方案(“三的阶乘是二的阶乘的三倍,四的阶乘是三的阶乘的四倍,以及等等”)。
在这里,您从“种子数据”开始,然后继续扩展种子集,只要您可以发现更多要添加的内容。一旦没有其他要添加的内容,您就停止并返回结果。
从某种意义上说,这与使用队列的breadth-first search 实现非常相似:您将初始元素添加到队列中,然后您的循环从队列中获取项目,并将其相关项目排入队列。一旦没有更多内容可添加,循环就会停止。
【讨论】:
是否有循环引用的可能?比如说我有一个第 0 条 IDN 记录,其经理本身就是第 0 条 IDN? @Nishant 是的,有。如果您点击了一条自行管理的Employee
记录,UNION ALL
将一次又一次地将其引入,直到您达到***别 100,此时查询将终止。
@SergeyKalinichenko - 谢谢......迟到了 7 年。我昨天偶然发现了这个,这是我很长时间以来看到的任何 sql 主题中最有用的东西,特别是与广度优先搜索的比较。以上是关于使用 CTE 进行递归查询的基本条件?的主要内容,如果未能解决你的问题,请参考以下文章