当前位置: 首页 > news >正文

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 LevelFROM EmployeesWHERE ManagerID IS NULLUNION ALLSELECT e.EmployeeID,e.Name,e.ManagerID,CONCAT(rc.HierarchyPath, ' > ', e.Name),rc.Level + 1FROM Employees eINNER 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 LevelFROM EmployeesWHERE ManagerID IS NULLUNION ALLSELECT e.EmployeeID,e.Name,e.ManagerID,e.Department,CONCAT(rc.HierarchyPath, ' > ', e.Name),rc.Level + 1FROM Employees eINNER 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

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

相关文章:

  • 家政预约小程序带商城,图文详解
  • LeetCode刷题--- 二叉搜索树中第K小的元素
  • 如何使用 Flutter 和地理位置 API 构建基于位置的移动应用程序?
  • 【前端】HTML5 CSS3新特性(学习笔记)
  • 12. IO
  • 2-2基础算法-递归/进制转换
  • mysql 与mssql 命令有那些区别
  • 【算法系列篇】递归、搜索和回溯(三)
  • HarmonyOS学习0基础版
  • 【深度学习】注意力机制(三)
  • weston 1: 编译与运行傻瓜教程(补充)
  • 【C语言】函数递归--输出n的k次方
  • 【Hive】
  • 智慧工地防盗新手段:TSINGSEE青犀工地智能监控防盗系统方案
  • 我的创作纪念日--第128天
  • JavaScript-如何实现克隆(clone)函数
  • Akka系列(七):Actor持久化之Akka persistence
  • Angularjs之国际化
  • ES2017异步函数现已正式可用
  • Golang-长连接-状态推送
  • jQuery(一)
  • Linux CTF 逆向入门
  • MySQL-事务管理(基础)
  • Rancher如何对接Ceph-RBD块存储
  • SpingCloudBus整合RabbitMQ
  • TypeScript实现数据结构(一)栈,队列,链表
  • XForms - 更强大的Form
  • 初探 Vue 生命周期和钩子函数
  • 前端
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 悄悄地说一个bug
  • 入手阿里云新服务器的部署NODE
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 移动端 h5开发相关内容总结(三)
  • 06-01 点餐小程序前台界面搭建
  • FaaS 的简单实践
  • 国内开源镜像站点
  • 如何在招聘中考核.NET架构师
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $(function(){})与(function($){....})(jQuery)的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (python)数据结构---字典
  • (办公)springboot配置aop处理请求.
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (四)图像的%2线性拉伸
  • (转)3D模板阴影原理
  • (转)Sql Server 保留几位小数的两种做法
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET建议使用的大小写命名原则
  • .NET中 MVC 工厂模式浅析