微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SqlServer 递归查询树形数据


转自:http://www.cnblogs.com/Lixinhua-GoOn/archive/2016/01/29/5169297.html

SqlServer 递归查询树形数据

一直没有在意过数据库处理树形数据的重要性,直到有一天朋友问起我关于树形数据查询的问题时才发现根本不会,正好这个时候也要用到递归进行树形数据的查询于是在网上查了一圈,语法总结如下

参考文献:https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(WITH_Tsql);k(sql11.SWB.TsqlRESULTS.F1);k(sql11.SWB.TsqlQUERY.F1);k(MISCELLANEOUSFILESPROJECT);k(DevLang-Tsql)&rd=true

 

一:简单的树形数据 代码如下:

复制代码

-- with一个临时表(括号中是你要查询的列名)
with temp(ID,PID,Name,curLevel)
as
(
--1初始查询(这里的PID=-1 在我的数据中是最底层的根节点)
select ID,1 as level from dbo.T_ACL_OU 
where Deleted = 0 and PID -1     
union all
2递归条件
select a.ID,a.PID,a.Name,b.curLevel+1from T_ACL_OU a   --3这里的临时表和原始数据表都必须使用别名,不然递归的时候不知道查询的是那个表的列
inner join
temp b
on ( a.PID=b.id)  这个关联关系很重要,一定要理解一下谁是谁的父节点
)
select * from temp   4递归完成后 一定不要少了这句查询语句 否则会报错

复制代码

效果如图:


这里要注意的地方是注释中的 1——4 的部分

二:带缩进的树形数据 代码如下:

初始查询 as curLevel convert(nvarchar(100),255); line-height:1.5!important">CONVERT(REPLICATE (' ',0); line-height:1.5!important">1)+a.Name)) as Name,0); line-height:1.5!important">1 这里的 REPLICATE函数非常重要,用于缩进空格用。不懂得可以在sqlserver中选中后按F1键 from T_ACL_OU a =b.id) ) temp

复制代码

效果如图:

三:查询是否有子节点

复制代码

with temp(ID,HandNo,curLevel,pLevel,haveChild)
as
(
--初始查询
1 as level,128); line-height:1.5!important">0 as pLevel,255); line-height:1.5!important">as haveChild where Deleted = 0 and PID = -1     
union all
--递归条件
1,b.curLevel,haveChild = (case when exists(from T_ACL_OU where T_ACL_OU.PID=a.id) then else 0 end)--(where exists(where a.PID=b.id)) 
from T_ACL_OU a 
inner join
temp b
on ( a.PID=b.id)
)
select * from temp order by pLevel

复制代码

效果如图:

这3段代码可以直接复制使用,修改一下表名和要查询的列名基本上都是通用的,写的比较简单,如果大家有什么意见建议请留言交流谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐