SQL Server ,使用递归查询具有层级关系的数据。

假设我们有一个表格 Employees,其中包含员工的层级关系信息,每一行包括员工的ID、姓名以及上级员工的ID。

下面是一个示例表格及其数据:

Employees
----------------------
EmployeeID | Name   | ManagerID
----------------------
1          | Alice  | NULL
2          | Bob    | 1
3          | Carol  | 1
4          | Dave   | 2
5          | Eve    | 2
6          | Frank  | 3

要以横向展示的方式查询递归数据,你可以使用如下的 SQL 查询:

WITH RecursiveCTE AS (
    SELECT 
        EmployeeID,
        Name,
        ManagerID,
        CAST(Name AS VARCHAR(MAX)) AS HierarchyPath,
        1 AS Level
    FROM Employees
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT 
        e.EmployeeID,
        e.Name,
        e.ManagerID,
        CONCAT(rc.HierarchyPath, ' > ', e.Name),
        rc.Level + 1
    FROM Employees e
    INNER JOIN RecursiveCTE rc ON e.ManagerID = rc.EmployeeID
)
SELECT 
    EmployeeID,
    HierarchyPath
FROM RecursiveCTE
ORDER BY EmployeeID;

在这个查询中,我们使用了一个递归的 CTE 来构建层级路径。在递归部分,我们连接 Employees 表与递归CTE,将每个员工的姓名添加到其上级的路径之后,并增加级别。最终,我们从递归CTE中选择员工ID和横向展示的层级路径。

结果将类似于这样:

EmployeeID | HierarchyPath
---------------------------
1          | Alice
2          | Alice > Bob
3          | Alice > Carol
4          | Alice > Bob > Dave
5          | Alice > Bob > Eve
6          | Alice > Carol > Frank

要在递归查询的横向展示中添加新字段,你可以在递归CTE中包含需要的额外字段,并在每个递归步骤中更新这些字段。下面的示例演示了如何添加一个新字段 Department 到递归查询结果中:

假设我们扩展了之前的示例表格 Employees,使其包含部门信息:

Employees
----------------------
EmployeeID | Name   | ManagerID | Department
----------------------
1          | Alice  | NULL      | HR
2          | Bob    | 1         | IT
3          | Carol  | 1         | HR
4          | Dave   | 2         | IT
5          | Eve    | 2         | IT
6          | Frank  | 3         | HR

现在,我们要在横向展示中包含每个员工的部门信息。以下是查询示例:

WITH RecursiveCTE AS (
    SELECT 
        EmployeeID,
        Name,
        ManagerID,
        Department,
        CAST(Name AS VARCHAR(MAX)) AS HierarchyPath,
        1 AS Level
    FROM Employees
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT 
        e.EmployeeID,
        e.Name,
        e.ManagerID,
        e.Department,
        CONCAT(rc.HierarchyPath, ' > ', e.Name),
        rc.Level + 1
    FROM Employees e
    INNER JOIN RecursiveCTE rc ON e.ManagerID = rc.EmployeeID
)
SELECT 
    EmployeeID,
    HierarchyPath,
    Department
FROM RecursiveCTE
ORDER BY EmployeeID;

在这个查询中,我们在递归CTE中包含了 Department 字段,并在递归的第二部分中将每个员工的部门信息传递下去。最终的查询结果将包括每个员工的ID、横向展示的层级路径以及部门信息:

EmployeeID | HierarchyPath           | Department
------------------------------------------------
1          | Alice                   | HR
2          | Alice > Bob             | IT
3          | Alice > Carol           | HR
4          | Alice > Bob > Dave      | IT
5          | Alice > Bob > Eve       | IT
6          | Alice > Carol > Frank   | HR

这个查询结果在横向展示的同时还包含了部门信息。你可以根据需要继续添加其他字段。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunsijia21983

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值