【问题标题】:Base condition in recursive query using CTE?使用 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

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

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

  2. 执行下一个 select 语句并与上述结果连接。我们 加入一个减少递归步骤/循环的条件 在这种情况下是经理。 [现在整个事情被称为 CTE]

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

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

【问题讨论】:

  • 基本条件是不涉及 CTE 的条件。那将是第一个子查询。

标签: sql recursion execution


【解决方案1】:

具有 CTE 的 SQL Server 中的递归定义与许多其他编程语言(例如函数式、命令式和逻辑语言)中的递归定义不同,因为“基本条件”是递归的开始,而不是结束。

在大多数程序员熟悉的递归中,您首先询问您想知道什么(例如,“5 的阶乘是多少?”),然后您的递归程序逐渐将请求简化为简单的东西,到达基本情况( “一的阶乘是什么?”),并在“展开”递归调用链时构建您的解决方案(“三的阶乘是二的阶乘的三倍,四的阶乘是三的阶乘的四倍,以及等等”)。

在这里,您从“种子数据”开始,然后继续扩展种子集,只要您可以发现更多要添加的内容。一旦没有其他要添加的内容,您就停止并返回结果。

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

【讨论】:

  • 是否有循环引用的可能?比如说我有一个第 0 条 IDN 记录,其经理本身就是第 0 条 IDN?
  • @Nishant 是的,有。如果您点击了一条自行管理的 Employee 记录,UNION ALL 将一次又一次地将其引入,直到您达到最高级别 100,此时查询将终止。
  • @SergeyKalinichenko - 谢谢......迟到了 7 年。我昨天偶然发现了这个,这是我很长时间以来看到的任何 sql 主题中最有用的东西,特别是与广度优先搜索的比较。
猜你喜欢
  • 2012-02-18
  • 2014-08-11
  • 2010-11-03
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多