最近有个需求,需要递归查询,以前也没有接触过,趁着遇到了,就花了一个小时研究了一下,现在写个总结,方便正在迷惘的你们。
先说一下大概的需求:
比如说学校每年都有若干个发展规划,现在每年的都有些差别,但是区别不大,所以,需要继承上一年度的规划的部分内容。要做个记录,并且记录一下规划的子版本。
表是这么建立的:
Create Table tb_theme_inherit(
Id int not null identity(1,1) primary key,
FatherPlanId varchar(36),
SonPlanId varchar(36),
CreateUser varchar(36),
CreateTime DateTime,
UpdateUser varchar(36),
UpdateTime DateTime
)
这是数据库创建表的语句。
现在我每次继承一个主题,我都把继承的主题和被继承的主题在这个表里做一个记录。父级ID FatherPlanId, 子级ID SonPlanId。
我放进去了一些测试数据:
仔细看ID 你会发现,除了第一条没有父级ID以外,就是没有继承关系。第二条是继承第一条,第三条又继承第二条,第四条又继承第三条。
接下来,我需要查询这些关联关系,就是去到一个规划ID,就往上把他的祖宗十八代都发掘一下,往下把他子子孙孙都发掘一下。
现在需求有了,上语法糖:
---with 子查询名称 查询字段列表 as --查询字段列表输入格式为([查询字段名1],[查询字段名2],...),也可用*代替,需要注意的是此处的查询字段列表中的字段与下方内容中定点成员与递归成员查询字段列表内容需一致
---(
-----定点成员
---select 查询字段列表 from 查询表名 where 查询条件
---union all
-----递归成员
---select 查询字段列表 from 查询表名 a inner join 子查询名称 on 递归条件 )
---select 显示字段名 from 子查询名称
语法糖也有了,剩下的就是写句子了,
递归查询子孙级:
with Con(Id,FatherPlanId,SonPlanId,CreateUser,level) as
(
select Id,FatherPlanId,SonPlanId,CreateUser,0 level from [dbo].[tb_theme_inherit] WHERE FatherPlanId='95c640fd-e6ab-4672-a086-24492c4105ce'
union all
select a.Id,a.FatherPlanId,a.SonPlanId,a.CreateUser,level+1 from [dbo].[tb_theme_inherit] a join Con on a.FatherPlanId=con.SonPlanId
)
select Id,FatherPlanId,SonPlanId,CreateUser,level from Con
递归查询祖宗十八代:
with Con(Id,FatherPlanId,SonPlanId,CreateUser,level) as
(
select Id,FatherPlanId,SonPlanId,CreateUser,0 level from [dbo].[tb_theme_inherit] WHERE SonPlanId='de27754f-d60a-43bd-95cd-14f531f6a5db'
union all
select a.Id,a.FatherPlanId,a.SonPlanId,a.CreateUser,level+1 from [dbo].[tb_theme_inherit] a join Con on a.SonPlanId=con.FatherPlanId
)
select Id,FatherPlanId,SonPlanId,CreateUser,level from Con
查询结果: