我从未使用递归的公共表达式(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:雇员关系的公共表达式和递归:
当我添加两个经理并在第二个经理下添加更多员工时,问题就开始了。
我想显示第一个经理的详细信息,并且在接下来的行中仅显示与该经理的下属相关的员工详细信息。
假设
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
这是否可能?