gpt4 book ai didi

sql - 递归查询 CTE

转载 作者:行者123 更新时间:2023-12-02 20:58:43 29 4
gpt4 key购买 nike

我正在阅读“Murach 的 SQL Server 2016 for Developers”一书中的示例。该示例说明了如何在 SQL 中编写递归 CTS 代码。我非常了解递归函数(在 C# 中),但我无法以某种方式理解 sql 递归逻辑是如何工作的。这是示例:

USE Examples;

WITH EmployeesCTE AS
(
-- Anchor member
SELECT EmployeeID,
FirstName + ' ' + LastName As EmployeeName,
1 As Rank
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
-- Recursive member
SELECT Employees.EmployeeID,
FirstName + ' ' + LastName,
Rank + 1
FROM Employees
JOIN EmployeesCTE
ON Employees.ManagerID = EmployeesCTE.EmployeeID
)
SELECT *
FROM EmployeesCTE
ORDER BY Rank, EmployeeID;

此查询返回组织中员工的层次结构级别。

我的问题:在递归函数中,您会看到一个递减变量,它终止递归(通过达到基本情况)。我的问题是:EmployeesCTE中相应的部分在哪里?请帮我理解逻辑。

最佳答案

所以我们所说的“递归CTE”实际上应该称为迭代CTE。这个想法是,为了定义一个递归表(在本例中为EmployeesCTE),我们首先创建一些初始行,在本例中这是通过

   SELECT EmployeeID, 
FirstName + ' ' + LastName As EmployeeName,
1 As Rank
FROM Employees
WHERE ManagerID IS NULL

(请注意,这不包含对 EmployeesCTE 的引用,因此它不是递归的),然后我们迭代一个表达式,在本例中

    SELECT Employees.EmployeeID, 
FirstName + ' ' + LastName,
Rank + 1
FROM Employees
JOIN EmployeesCTE
ON Employees.ManagerID = EmployeesCTE.EmployeeID

生成更多行。我们这样做,直到该表达式不返回任何行。在此表达式中,EmployeesCTE 引用该表的先前版本,并通过对其求值,我们计算该表的下一个版本。

因此停止递归(或更确切地说迭代)的条件是递归表达式没有产生新行。

现在让我们仔细看看上述所有内容如何应用于您给出的特定示例。我们最初的行集由没有经理的员工组成(我们将其称为排名 1 的员工)。然后我们找到上一步中找到的员工所管理的所有员工(我们将其称为排名 2 的员工)。然后我们发现这些员工是由级别 2 的员工管理的,并称其为级别 3,依此类推。最终我们将达到找不到新员工的步骤(当然假设所管理的关系没有循环)。

关于sql - 递归查询 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39357296/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com