我从不使用CTE进行递归。我只是在读一篇有关它的文章。本文通过Sql Server CTE和递归显示员工信息。它基本上显示了员工及其经理的信息。我无法理解此查询的工作方式。这是查询:
WITH
cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID, FirstName, LastName, ManagerID, 1
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.ManagerID = r.EmpID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees
WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID
我在这里发布有关输出显示方式的信息:
我只需要知道它如何首先显示经理,然后再显示其下属。我猜第一个sql语句仅触发一次,并且返回所有员工ID。
然后第二个查询反复触发,并使用当前经理ID查询存在员工的数据库。
请说明sql语句如何在内部循环中执行,并告诉我sql的执行顺序。谢谢。
我的第二阶段问题
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
问题1)N的值如何递增?如果每次都将值分配给N,则可以递增N值,但是只有在第一次初始化N值时。
问题2)CTE和员工关系递归:
我开始添加两个经理并在第二个经理下添加更多雇员的那一刻开始出现问题。
我想显示第一个经理详细信息,在接下来的行中仅显示与该经理下属相关的那些员工详细信息。
假设
ID Name MgrID Level
--- ---- ------ -----
1 Keith NULL 1
2 Josh 1 2
3 Robin 1 2
4 Raja 2 3
5 Tridip NULL 1
6 Arijit 5 2
7 Amit 5 2
8 Dev 6 3
我想用CTE表达式以这种方式显示结果。请告诉我在此处给出的sql中进行哪些修改,以拉动经理与员工的关系。谢谢。
我希望输出是这样的:
ID Name MgrID nLevel Family
----------- ------ ----------- ----------- --------------------
1 Keith NULL 1 1
3 Robin 1 2 1
2 Josh 1 2 1
4 Raja 2 3 1
5 Tridip NULL 1 2
7 Amit 5 2 2
6 Arijit 5 2 2
8 Dev 6 3 2
这可能吗...?