700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > SQL 递归树 子父节点相互查询

SQL 递归树 子父节点相互查询

时间:2022-02-08 03:43:34

相关推荐

SQL 递归树 子父节点相互查询

if object_id('[tb]') is not null drop table [tb]gocreate table [tb]([modeid] int,modename varchar(20),parentid int)insert [tb]select 100 ,'商品管理', 0 union allselect 101 ,'定单管理', 0 union allselect 102 ,'用户管理', 0 union allselect 104 ,'学院广告', 0 union allselect 105 ,'系统设置', 0 union allselect 106 ,'附件管理', 0 union allselect 107 ,'商品管理', 100 union allselect 108 ,'明细管理', 100 union allselect 109 ,'物流管理', 100 union allselect 110 ,'商品信息管理', 107 union allselect 111 ,'商品分类管理', 107 union allselect 112 ,'回收站管理', 107 union allselect 114 ,'团购管理', 108 union allselect 115 ,'拍卖管理', 108 union allselect 116 ,'优惠管理', 108 union allselect 117 ,'会员管理', 102 union allselect 118 ,'会员卡管理', 102 union allselect 119 ,'资金管理', 102 union allselect 120 ,'管理员管理', 102 union allselect 121 ,'添加管理员', 120 union allselect 122 ,'修改管理员', 120go--查所有子结点if object_id('f_getC') is not null drop function f_getCgocreate function f_getC(@id int) returns @re table(id int,level int,sort varchar(10)) asbegindeclare @l intset @l=0 insert @re select @id,@l,nullwhile @@rowcount>0beginset @l=@l+1insert @re select a.modeid,@l,ltrim(isnull(b.sort,a.modeid)) from tb as a,@re as b where b.id=a.parentid and b.level=@l-1endupdate @re set level = level -1returnendgo select a.modeid,a.parentid,REPLICATE(' ',b.level) +'┝'+a.modename,b.level,b.sort from tb a,f_getC(0) b where a.modeid=b.id order by case when b.level<2 then 0 else 1 end,b.sort,b.level/*modeidparentidsort level----------- ----------- -------------------------------------------------- ---------- -----------100 0 ┝商品管理100 0107 100 ┝商品管理 100 1108 100 ┝明细管理 100 1109 100 ┝物流管理 100 1101 0 ┝定单管理101 0102 0 ┝用户管理102 0117 102 ┝会员管理 102 1118 102 ┝会员卡管理 102 1119 102 ┝资金管理 102 1120 102 ┝管理员管理 102 1104 0 ┝学院广告104 0105 0 ┝系统设置105 0106 0 ┝附件管理106 0110 107 ┝商品信息管理100 2111 107 ┝商品分类管理100 2112 107 ┝回收站管理 100 2114 108 ┝团购管理 100 2115 108 ┝拍卖管理 100 2116 108 ┝优惠管理 100 2121 120 ┝添加管理员 102 2122 120 ┝修改管理员 102 2(所影响的行数为 21 行)*/--查所有子结点,带路径与排序if object_id('f_getC') is not null drop function f_getCgocreate function f_getC(@id int) returns @re table(id int,level int,sort varchar(100),path varchar(500)) asbegindeclare @l intset @l=0 insert @reselect [modeid],@l,right('00000'+ltrim(modeid),5),modenamefrom tb where parentid=@idwhile @@rowcount>0beginset @l=@l+1insert @reselect a.modeid,@l,b.sort+right('00000'+ltrim(a.modeid),5),b.path+' - '+a.modenamefrom tb as a,@re as b where b.id=a.parentid and b.level=@l-1endupdate @re set level = levelreturnendgo select a.modeid,a.parentid,REPLICATE(' ',b.level) +'┝'+a.modename,b.level,b.sort ,b.path from tb a,f_getC(0) b where a.modeid=b.id order by sort/*modeidparentidlevel ----------- ----------- -------------------- ----------- -------------------- ----------------------------------------100 0 ┝商品管理0 00100商品管理107 100 ┝商品管理 1 0010000107 商品管理 - 商品管理110 107 ┝商品信息管理2 001000010700110商品管理 - 商品管理 - 商品信息管理111 107 ┝商品分类管理2 001000010700111商品管理 - 商品管理 - 商品分类管理112 107 ┝回收站管理 2 001000010700112商品管理 - 商品管理 - 回收站管理108 100 ┝明细管理 1 0010000108 商品管理 - 明细管理114 108 ┝团购管理 2 001000010800114商品管理 - 明细管理 - 团购管理115 108 ┝拍卖管理 2 001000010800115商品管理 - 明细管理 - 拍卖管理116 108 ┝优惠管理 2 001000010800116商品管理 - 明细管理 - 优惠管理109 100 ┝物流管理 1 0010000109 商品管理 - 物流管理101 0 ┝定单管理0 00101定单管理102 0 ┝用户管理0 00102用户管理117 102 ┝会员管理 1 0010200117 用户管理 - 会员管理118 102 ┝会员卡管理 1 0010200118 用户管理 - 会员卡管理119 102 ┝资金管理 1 0010200119 用户管理 - 资金管理120 102 ┝管理员管理 1 0010200120 用户管理 - 管理员管理121 120 ┝添加管理员 2 001020012000121用户管理 - 管理员管理 - 添加管理员122 120 ┝修改管理员 2 001020012000122用户管理 - 管理员管理 - 修改管理员104 0 ┝学院广告0 00104学院广告105 0 ┝系统设置0 00105系统设置106 0 ┝附件管理0 00106附件管理(21 行受影响)*/----------

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。