使用 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 进行递归查询的基本条件?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server CTE 递归查询全解

SQL递归查询知多少

SQL Server CTE 和递归示例

MYSQL 8.019 CTE 递归查询怎么解决死循环三种方法

SQL 递归查询,意淫CTE递归的执行步骤

sql server使用cte递归查询获取树形的父节点/子节点