【发布时间】:2016-09-06 20:26:03
【问题描述】:
我正坐在“Murach 为开发人员编写的 SQL Server 2016”一书中的示例。该示例说明了如何在 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 中的对应部分在哪里?请帮我理解逻辑。
【问题讨论】:
-
这里
INNER JOIN用作过滤器,它的ON条件服务器用作“终结者”,只要基础表没有任何循环引用。 -
根据经验,我想提请您注意这样一个事实,即这在大数据上表现不佳。或者,考虑将 RootManagerID 添加到员工表中。然后
SELECT EmployeeID, ManagerID, FirstName + ' ' + LastName As EmployeeName FROM Employees WHERE RootManagerID = @RootManagerID。然后在应用程序级别构建您的树。除了通过这种方法获得巨大的性能优势外,它还允许您通过在RootManagerID上创建索引来进一步提高性能。 -
@yazanpro,这将在大数据上表现不佳,因为它是一个隐藏的RBAR...
-
@Shnugo 没错。
-
嗨,阿里夫,这个问题得到解答了吗?您需要进一步的帮助吗?
标签: sql sql-server common-table-expression recursive-query