SQL SERVER 2005之前的版本只能用函数方法实现,SQL SERVER 2005之后新增了CTE功能,可以利用CTE实现递归查询;

  CTE:公用表达式Common Table Expression 是SQL SERVER 2005版本之后引入的一个特性;

#填充测试数据

1、sql

 Create table GroupInfo([Id] int,[GroupName] nvarchar(50),[ParentGroupId] int)

 Insert GroupInfo

 select 0,'某某大学',null union all

 select 1,'外语学院',0 union all
select 2,'英语专业',1 union all
select 3,'日语专业',1 union all
select 4,'英语专业一班',2 union all
select 5,'英语专业二班',2 union all
select 6,'日语专业一班',3 union all
select 7,'日语专业二班',3 union all select 8, '法学院',0 union all
select 9, '刑法学专业',8 union all
select 10,'经济法学专业',8 union all
select 11,'刑法学专业一班',9 union all
select 12,'刑法学专业二班',9 union all
select 13,'经济法学专业一班',10 union all
select 14,'经济法学专业二班',10

2、效果图

#递归实现Demo

1、根据指定的节点向上获取所有父节点,向下获取所有子节点

 --根据指定的节点向下获取所有子节点
with
CTE
as
(
select * from GroupInfo where Id=1
union all
select G.* from CTE inner join GroupInfo as G
on CTE.Id=G.ParentGroupId
)
select * from CTE order by Id
 --根据指定的节点向上获取所有父节点
with
CTE
as
(
select * from GroupInfo where Id=14
union all
select G.* from CTE inner join GroupInfo as G
on CTE.ParentGroupId=G.Id
)
select * from CTE order by Id

2、构造递归路径

 --构造递归路径
with
CTE
as
(
select Id,GroupName,ParentGroupId,GroupPath=CAST( GroupName as nvarchar(max)) from GroupInfo where Id=1
union all
select G.*,CAST(CTE.GroupPath+'//'+G.GroupName as nvarchar(max)) as GroupPath from CTE
inner join GroupInfo as G
on CTE.Id=G.ParentGroupId
)
select * from CTE

3、分组递归,将同一条分支上节点放到一起

 --通过id字段的字符串的拼接,形成sort字段,再通过sort排序,来实现同一分支上的节点放到一起
WITH
CTE
AS
(
SELECT * ,CAST(RIGHT('' + CAST([Id] AS VARCHAR), 3) AS VARCHAR(MAX)) AS sort FROM GroupInfo
WHERE ParentGroupId = 0
UNION ALL
SELECT GroupInfo.* ,CAST(sort + RIGHT('' + CAST(GroupInfo.[Id] AS VARCHAR),3) AS VARCHAR(MAX)) AS sort
FROM CTE
INNER JOIN GroupInfo ON CTE.Id = GroupInfo.ParentGroupId
)
SELECT * FROM CTE ORDER BY sort

4、递归层级查询(查询出节点所属的层级)

 --查询节点层级
WITH CTE AS (
SELECT *,1 AS [Level] FROM GroupInfo WHERE ParentGroupId=0
UNION ALL
SELECT G.*,CTE.Level+1 FROM GroupInfo as G
JOIN CTE ON CTE.Id =G.ParentGroupId
)
SELECT * FROM CTE

【Sql Server】SQL SERVER 递归查询的更多相关文章

  1. SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因

    复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过 ...

  2. SQL Server SQL分页查询

    SQL Server SQL分页查询的几种方式 目录 0.    序言 1.    TOP…NOT IN… 2.    ROW_NUMBER() 3.    OFFSET…FETCH 4.    执行 ...

  3. Qt调用Server SQL中的存储过程

    Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...

  4. 对SQL Server SQL语句进行优化的10个原则

    1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说:①.有大 ...

  5. .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)

    原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...

  6. MySQL连接数据库报时区错误:java.sql.SQLException: The server time zone value

    连接MySQL数据库时报以下时区错误信息: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized ...

  7. 连接mysql数据库报错java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized...解决方法

    今天连接mysql数据库报错如下: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or r ...

  8. MySql数据库时区异常,java.sql.SQLException: The server time zone value '?й???׼ʱ?' is unrecognized or represents more than one time zone.

    JDBC访问MySql异常 Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException ...

  9. 【JDBC】java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.

    在使用阿里的druid 时,报了一个异常java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized ...

  10. 【SQL Server 问题记录】A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.

    本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 A network-related or instance-specific error occurred while esta ...

随机推荐

  1. Linux垃圾清理

    一.删除缓存 1,非常有用的清理命令:sudo apt-get autoclean                清理旧版本的软件缓存sudo apt-get clean                ...

  2. git执行cherry-pick时修改提交信息

    git执行cherry-pick时修改提交信息 在本地分支执行cherry-pick命令时有时需要修改commit message信息,可以加参数-e实现: git cherry-pick -e co ...

  3. web框架。Django--

    一,DIY一个web框架 1.1什么是web框架 1.2用socket模拟B-S的服务端 1.3,浏览器端的network查看 1.4,request格式 1.5,response格式 1.6,初识w ...

  4. 厚着脸皮求领导写了一篇java小白进阶大牛之路!!!

    缘起&应朋友之邀 2019年已经过去两个月了,应朋友之邀,写写自己的个人经历,与其说经历还不如是自我的总结与反思.2012年2月份只身一人拖着行李箱来到北京库巴科技有限公司实习,那时候库巴处在 ...

  5. Parallel 类并行任务(仅仅当执行耗时操作时,才有必要使用)

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  6. Golang 入门系列(七) Redis的使用

    安装 1. Redis 的安装很简单,我这里测试直接用的是windows 的版本.如何安装就不细说了.想了解的可以看之前的文章:https://www.cnblogs.com/zhangweizhon ...

  7. C#调用Delphi DLL获取字符串(C# IntPtr 与 string互转 )

    前因后果 调用一门锁的dll实现读取酒店IC卡数据,直接用Readme里的方法出错. 函数声明: 一.读卡函数    ************************ Delphi 调用 ****** ...

  8. 基于struts2、hibernate、spring、shiro、MySQL的项目开发

    使用maven管理jar包的依赖 < project xmlns = “ http://maven.apache.org/POM/4.0.0 ” xmlns :xsi = “ http://ww ...

  9. PS绘制飘逸彩色丝带教程

    一.新建一个大小适当的图像,点击工具栏上的钢笔工具,使用形状图层来绘制出下图的形状. 二.把形状所在层的填充设为0%,填充设成0是不会影响到图层的,不像不透明度那样会影响图层样式的效果. 三.双击丝带 ...

  10. vue组件之前嵌套

    https://www.cnblogs.com/chengduxiaoc/p/7099552.html <!DOCTYPE html> <html lang="en&quo ...