1.建表脚本

CREATE TABLE [dbo].[tb_tree](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ParentId] [int] NULL,
[NodeName] [nvarchar](50) NULL,
CONSTRAINT [PK_tb_tree] 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]

[Id]--主键自增

[ParentId]--树形结构中表示从属的父节点

[NodeName] --节点名称

2.插入测试数据

SET IDENTITY_INSERT [dbo].[tb_tree] ON
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (1, 0, N'Root1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (2, 1, N'Level1-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (3, 1, N'Level1-2')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (4, 2, N'Level1-1-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (5, 2, N'Level1-1-2')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (6, 2, N'Level1-1-3')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (7, 2, N'Level1-1-4')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (8, 3, N'Level1-2-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (9, 4, N'Level1-1-1-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (10, 4, N'Level1-1-1-2')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (11, 5, N'Level1-1-2-1')
SET IDENTITY_INSERT [dbo].[tb_tree] OFF

插入结构表示树形结构为:

Root1

┗---Level1-1

┗---Level1-1-1

┗---Level1-1-1-1

┗---Level1-1-1-2

┗---Level1-1-2

┗---Level1-1-2-1

┗---Level1-1-3

┗---Level1-2

┗---Level1-2-1

┗---Level1-3

3.需求1:当需要从任意节点获取所有的子节点父节点列表时,如从Level1-2-1节点需要获取所有的父节点(Level1-2,Root1)

with treeinfo as
(
select Id,ParentId,NodeName from tb_tree where id = 8
union all
select t.Id,t.parentId,t.NodeName from treeinfo ti
inner join tb_tree t on ti.ParentId = t.ID
) select * from treeinfo

查询结果如下:

Id       ParentId    NodeName
----------- ----------- --------------------------------------------------
10           4        Level1-1-1-2
4           2               Level1-1-1
2           1               Level1-1
1           0               Root1

需求2:从父节点获取所有层级的子节点,如从节点Level1-1查找所有字节点

with treeinfo as(
select Id,ParentId,NodeName from tb_tree where id=2
union all
select t.Id,t.ParentId,t.NodeName from treeinfo ti
inner join tb_tree t on ti.id = t.Parentid
) select * from treeinfo

基本同需求1写法差不多,查询结果如下:

Id              ParentId     NodeName
----------- ----------- --------------------------------------------------
2               1               Level1-1
4               2               Level1-1-1
5               2               Level1-1-2
6               2               Level1-1-3
7               2               Level1-1-4
11             5               Level1-1-2-1
9               4               Level1-1-1-1
10             4               Level1-1-1-2

公用表表达式CTE简单递归使用-简单树形结构的更多相关文章

  1. sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...

  2. 公用表表达式 (CTE)、递归、所有子节点、sqlserver

    指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式. 对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分 ...

  3. SQL Server 公用表表达式(CTE)实现递归

    公用表表达式简介: 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集.CTE 与派生表类 ...

  4. SQL Server 公用表表达式(CTE)实现递归的方法

    公用表表达式简介: 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集.CTE 与派生表类 ...

  5. 公用表表达式 (CTE)、递归

    指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式. 对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分 ...

  6. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...

  7. 详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集 ...

  8. T-SQL查询进阶--详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的. 但是,视图是作为系统对象存在数据库中,那对于结果 ...

  9. T-SQL 公用表表达式(CTE)

    公用表表达式(CTE) 在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式( ...

  10. 公用表表达式(CTE)

    在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以使用公用表表达式的方法.公用表表达式(Common Table ...

随机推荐

  1. C-晾衣服

    链接:https://ac.nowcoder.com/acm/contest/892/C 题意: 鸡尾酒从杭州回来,囤积了许多衣服,洗好之后,他发现晾衣服是一件麻烦的事. 晾衣绳的长度只有L,而鸡尾酒 ...

  2. Netty(5)@Sharable

    问题:我写了MyDecoder which extends ByteToMessageDecoder,单线程没问题,但是多线程时,报'the handler should be sharable'.查 ...

  3. sql-monitore 的bug 。

    http://www.mamicode.com/info-detail-1659243.html 存储过程无法做 sql -monitor , 而存储过程跑的sql (只能通过awr 报告来看sql_ ...

  4. ADC中的滤波算法

    STM32的AD最大输入时钟不超过14MHZ,最高采样速度1us,可以采用DMA或者内部的基本定时器/高级定时器来触发,利用模拟看门狗监控所选择的的所有通道,如果超过模拟的 阀[fá] 值,将产生中断 ...

  5. (转) Linux 下的dd命令使用详解(摘录)

    使用dd命令克隆整个系统------http://www.cnblogs.com/jikexianfeng/p/6103504.html 原文:https://www.cnblogs.com/jike ...

  6. python之三级菜单

    python之三级菜单 要求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功 ...

  7. P4874 回形遍历 —模拟

    思路: 写完后信心满满,结果超时. 我很不解,下了个数据结果——,z竟然是大于1e10的,跟题目给的不一样啊 原来如此,正解是一行一行的走的... 注意当到两边一样近时,应优先向下和右!!!!!! 这 ...

  8. codeforces Gym 100286J Javanese Cryptoanalysis (二染色)

    每一单词相邻两个字母,不能同时为元音或者辅音... 各种姿势都可以过:7个for,dp,黑白染色,dfs,并查集.... 最主要的思路就是相邻字母连边,把元音和辅音看成两个集合,那么有连边的两个字母一 ...

  9. UVA 1149 Bin Packing 装箱(贪心)

    每次选最大的物品和最小的物品放一起,如果放不下,大物体孤独终生,否则相伴而行... 答案变得更优是因为两个物品一起放了,最大的物品是最难匹配的,如果和最小的都放不下的话,和其它匹配也一定放不下了. # ...

  10. 3. Netbackup 7.6客户端的安装(windows/linux)

    1 客户端的安装 1.1 Windows客户端安装 1.1.1 客户端hosts修改 windows xp/2003/vista/2008/7/8用户HOSTS文件是在“c:\windows\syst ...