SqlServer 递归查询树

网友投稿 798 2022-08-31

SqlServer 递归查询树

SqlServer 递归查询树

递归关于进行树形结构的查询:

一:简单的树形结构代码。

-- with一个临时表(括号中是你要查询的列名)with temp(ID,PID,Name,curLevel)as(--1:初始查询(这里的PID=-1 在我的数据中是最底层的根节点)select ID,PID,Name,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 jointemp bon ( a.PID=b.id) --这个关联关系很重要,一定要理解一下谁是谁的父节点)select * from temp --4:递归完成后 一定不要少了这句查询语句 否则会报错

二:带缩进的树形机构

with temp(ID,PID,Name,curLevel)as(--初始查询select ID,PID,Name,1 as curLevel from dbo.T_ACL_OU where Deleted = 0 and PID = -1 union all--递归条件select a.ID,a.PID, convert(nvarchar(100),CONVERT(nvarchar(100), REPLICATE (' ', b.curLevel+1)+a.Name)) as Name , b.curLevel+1 --这里的 REPLICATE函数非常重要,用于缩进空格用。不懂得可以在SQLserver中选中后按F1键from T_ACL_OU a inner jointemp bon ( a.PID=b.id))select ID,PID,Name,curLevel from temp

三:查询是否有子节点

with temp(ID,PID,HandNo,Name,curLevel,pLevel,haveChild)as(--初始查询select ID,PID,HandNo,Name,1 as level,0 as pLevel,1 as haveChild from dbo.T_ACL_OU where Deleted = 0 and PID = -1 union all--递归条件select a.ID,a.PID,a.HandNo,a.Name, b.curLevel+1,b.curLevel,haveChild = (case when exists(select 1 from T_ACL_OU where T_ACL_OU.PID=a.id) then 1 else 0 end)--(select 1 from T_ACL_OU where exists(select 1 from T_ACL_OU where a.PID=b.id)) from T_ACL_OU a inner jointemp bon ( a.PID=b.id))select * from temp order by pLevel

这3段代码可以直接复制使用,修改一下表名和要查询的列名基本上都是通用的.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ERP客户关系渠管理(二十)
下一篇:Go语言潜力有目共睹,但它的Goroutine机制底层原理你了解吗?(go语言底层原理剖析 豆瓣)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~