经常会出现一个业务场景,当前已知ID,怎么获取他的子节点数据呢?怎么获取父节点的数据呢?下面用代码展示一个最简单的例子:

/*创建一张员工表*/
CREATE TABLE [dbo].[Employee]([ID] [uniqueidentifier] NOT NULL,--用户ID[ParentGUID] [uniqueidentifier] NOT NULL,--上级ID[ECode] [nvarchar](50) NOT NULL,--员工编号[EName] [nvarchar](200) NOT NULL--员工名称CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED
([ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
/*插入几条基础数据*/
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'CF06903A-1D9B-4896-916E-56E4B8CB1955', N'00000000-0000-0000-0000-000000000000', N'SG001', N'董事长')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'DD994FDA-1703-4616-AF1B-165164DF710E', N'CF06903A-1D9B-4896-916E-56E4B8CB1955', N'SG0012', N'经理')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'138C93C0-387B-4582-8A56-E036056A97F2', N'DD994FDA-1703-4616-AF1B-165164DF710E', N'SG0013', N'部长')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'88F1D9F7-CC02-4449-BA0A-8717142FFB4D', N'138C93C0-387B-4582-8A56-E036056A97F2', N'SG0014', N'主管')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'166FA95A-0425-40E3-8CB9-2A4C97CA4CC6', N'88F1D9F7-CC02-4449-BA0A-8717142FFB4D', N'SG00141', N'邵工')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'6E94AA52-700A-4415-BB8A-34345605E13D', N'88F1D9F7-CC02-4449-BA0A-8717142FFB4D', N'SG00142', N'李工')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'C5E537D4-0994-43E2-A1AB-3F736B4E22D3', N'88F1D9F7-CC02-4449-BA0A-8717142FFB4D', N'SG00143', N'高工')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'61F79EAF-DB86-425E-A61C-4228265EEC28', N'88F1D9F7-CC02-4449-BA0A-8717142FFB4D', N'SG00144', N'卜工')
INSERT [dbo].[Employee] ([ID], [ParentGUID], [ECode], [EName]) VALUES (N'34C26725-3726-4C45-90C0-440C91EF34B8', N'88F1D9F7-CC02-4449-BA0A-8717142FFB4D', N'SG00145', N'苏工')

  

我的解决办法是使用WITH AS 语句
WITH AS的含义WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会
被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数
据的部分。 特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,
所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将
WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS
短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

/*获得主管所有上司*/
;WITH cteTemp AS
(SELECT [ID], [ParentGUID], [ECode], [EName]FROM [Employee] WHERE ID = '88F1D9F7-CC02-4449-BA0A-8717142FFB4D'/*主管ID*/UNION ALLSELECT A.[ID], A.[ParentGUID], A.[ECode], A.[EName]FROM [Employee] A INNER JOIN cteTemp B ON A.[ID] = B.[ParentGUID]
)
SELECT *  FROM cteTemp

  

/*获得主管所有手下*/
;WITH cteTemp AS
(SELECT [ID], [ParentGUID], [ECode], [EName]FROM [Employee] WHERE ID = '88F1D9F7-CC02-4449-BA0A-8717142FFB4D'/*主管ID*/UNION ALLSELECT A.[ID], A.[ParentGUID], A.[ECode], A.[EName]FROM [Employee] A INNER JOIN cteTemp B ON A.[ParentGUID] = B.[ID]
)
SELECT *  FROM cteTemp

  

  

  

转载于:https://www.cnblogs.com/liangsheng/p/8933854.html

SQL Server 实现递归获取层级数据相关推荐

  1. SQL Server 2008处理隐式数据类型转换在执行计划中的增强

    关注我们获得更多内容 作者 | 邹建,资深数据库专家,精通各项 SQL Server 技术,具有丰富的管理.维护.优化能力以及业务应用经验.他一直热心于技术知识的分享.传播,持续活跃在 CSDN 和 ...

  2. CREATE VIEW SQL:通过SQL Server中的视图插入数据

    This is the third article in a series of learning the CREATE VIEW SQL statement. So far, I'd say tha ...

  3. Sql Server函数全解三数据类型转换函数和文本图像函数

    原文:Sql Server函数全解<三>数据类型转换函数和文本图像函数 一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近 ...

  4. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  5. SQL Server 找回没有备份的数据

    SQL Server 找回没有备份的数据 问题: 有一个库, 做的是 全备份+日志备份,在2011年3月8日,14点产生一次全备份,在14:10分产生日志备份,在14:12分down       机, ...

  6. SQL SERVER 系列(7)数据表排序和聚集函数

    SQL SERVER 系列(6)数据表排序和聚集函数 数据表排序: 当我们在对数据库操作的时候,我们经常会遇到对年龄,对考试成绩进行排序的问题,排序可以使我们对所要显示的数据一目了然,因此排序就成为了 ...

  7. SQL Server 2008使用LINQ进行数据访问(转载自IT168 [ http://www.it168.com/ ])

    SQL Server 2008使用LINQ进行数据访问 2008年09月23日 IT168网站原创 作者:微软中国 编辑:胡铭娅 评论:0条 本文Tag: LINQ SQL Server 2008 微 ...

  8. SQL Server 自动循环归档分区数据脚本

    SQL Server 自动循环归档分区数据脚本 原文:SQL Server 自动循环归档分区数据脚本 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/表分区 概述 在很多业务场景 ...

  9. 轻松实现SQL Server与Access、Excel数据表间的导入导出

    在SQL SERVER 2000/2005中除了使用DTS进行数据的导入导出,我们也可以使用Transact-SQL语句进行导入导出操作.在Transact-SQL语句中,我们主要使用OpenData ...

最新文章

  1. mpi并行 java_【并行计算】用MPI进行分布式内存编程(一)
  2. 计算机本科211调剂到双非值得吗,经验分享:从双非到211,调剂是场快准狠的战役...
  3. 12层打败50层,ParNet 普林斯顿+英特尔:更深不一定更好
  4. 手把手 docker 从零搭建 jenkins 服务器
  5. android alpha java_Android support 26.0.0-alpha1 产生的问题(zz)
  6. 【华为】对标谷歌Dropout专利,华为开源自研算法Disout,多项任务表现更佳
  7. windows时间设置
  8. u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
  9. 西门子PLC的常见的通讯方式
  10. JS方法 数组倒序排列
  11. 洛谷 P3110 [USACO14DEC]驮运Piggy Back spfa
  12. RNN的数学符号(Notation)
  13. Java项目:赛事打分系统(java+SSM+Layui+Maven+mysql)
  14. 联想服务器系统机房,联想10月1日完成收购IBM x86服务器
  15. 十大排序算法(C++)(时间复杂度O(nlogn)篇:希尔排序、堆排序、快速排序、归并排序)
  16. Android11 禁止第三方APP安装,通过白名单管理
  17. mysql实战(五)—— You can‘t specify target table ‘org_department‘ for update in FROM clause
  18. 2019年伯克利大学 CS294-112《深度强化学习》第1讲:课程介绍和概览(笔记)
  19. 搜狗大数据总监、Polarr 联合创始人关于深度学习的分享交流
  20. 2017中国智能商用车国际峰会

热门文章

  1. Error creating bean with name 'userServiceImpl': Injection of autowired dependencies failed
  2. iOS UIWebView打电话
  3. Kafka的通讯协议
  4. super.getClass()与this.getClass()
  5. css3在线快速制作工具
  6. 在Silverlight3绘制sprite图片的一部分
  7. 开源组件 Ehcache中被曝严重漏洞,影响多款Jira产品
  8. 【leetcode】416. Partition Equal Subset Sum
  9. Jmeter分布式测试-远程调用
  10. 多VLAN配置DHCP