【Sql Server】SQL SERVER 递归查询
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 递归查询的更多相关文章
- SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因
复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过 ...
- SQL Server SQL分页查询
SQL Server SQL分页查询的几种方式 目录 0. 序言 1. TOP…NOT IN… 2. ROW_NUMBER() 3. OFFSET…FETCH 4. 执行 ...
- Qt调用Server SQL中的存储过程
Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...
- 对SQL Server SQL语句进行优化的10个原则
1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说:①.有大 ...
- .NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1)
原文:.NET编程和SQL Server ——Sql Server 与CLR集成 (学习笔记整理-1) 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数 ...
- MySQL连接数据库报时区错误:java.sql.SQLException: The server time zone value
连接MySQL数据库时报以下时区错误信息: java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized ...
- 连接mysql数据库报错java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized...解决方法
今天连接mysql数据库报错如下: java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or r ...
- 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 ...
- 【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 ...
- 【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 ...
随机推荐
- XML详解二XML的解析与创建
XML用来传输和存储数据,如何解析获取到的XML文本呢? 一.解析XML 创建demo.xml文件: <?xml version="1.0" encoding="U ...
- Selenium自动化测试-unittest单元测试框架使用
一.什么是unittest 这里我们将要用的unittest是python的单元测试框架,它的官网是 https://docs.python.org/2/library/unittest.html,在 ...
- easyui中datagrid+layout布局
1.掌握layout布局 首先,layout布局的具体使用可参考官网http://www.jeasyui.net/plugins/162.html layout布局分为东南西北中五个区域,如图我们将其 ...
- asp.net 客户端请求到响应的整个过程
出处:https://www.cnblogs.com/Joans/archive/2012/02/08/2342887.html 疑惑?从客户端发出一个请求,请求到达服务端如何和IIS关联起来?IIS ...
- .Net Cache
在.net中有两个类实现了Cache HttpRuntime.Cache 应该程序使用的Cache,web也可以用 HttpContext.Current.Cache web上下文的Cache对象, ...
- MapReduce shuffle过程剖析及调优
MapReduce简介 在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的.数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问 ...
- (六)List All Indices
Now let’s take a peek at our indices: 现在让我们来看看我们的指数: GET /_cat/indices?v And the response: health st ...
- MATLAB accumarray
先看看subs和val的具体内容 subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2]; subs = 1 1 1 2 1 2 2 ...
- 初学python必备基础知识
一,编程语言介绍 1.机器语言:直接用二进制编程,直接控制硬件,需要掌握硬件的操作细节 优点:执行效率高 缺点: 开发效率低 2.汇编语言:用英文标签取代二进制指令去编写程序,直接控制硬件,需 ...
- jsLibrary.js
以前看犀牛书收藏和组合别人的库. ; (function () { 'use strict'; if (!Date.now) Date.now = function () { return new D ...