最佳答案
我从不在递归中使用 CTE。我正在读一篇关于它的文章。本文在 Sql 服务器 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
Q 1) N 的值是如何增加的?如果每次将值赋给 N,则 N 值可以递增,但只能在第一次初始化 N 值时递增。
问题2)员工关系递归:
当我在第二个经理之下添加两个经理和几个员工的时候,问题就开始了。
我希望显示第一个经理细节,并且在下一行中只显示与该经理的下属相关的员工细节。
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
Is this possible...?