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

if object_id(‘[tb]‘) is not null drop table [tb]
go
create table [tb]([modeid] int,modename varchar(20),parentid int)
insert [tb]
select 100 ,‘商品管理‘, 0 union all
select 101 ,‘定单管理‘, 0 union all
select 102 ,‘用户管理‘, 0 union all
select 104 ,‘学院广告‘, 0 union all
select 105 ,‘系统设置‘, 0 union all
select 106 ,‘附件管理‘, 0 union all
select 107 ,‘商品管理‘, 100 union all
select 108 ,‘明细管理‘, 100 union all
select 109 ,‘物流管理‘, 100 union all
select 110 ,‘商品信息管理‘, 107 union all
select 111 ,‘商品分类管理‘, 107 union all
select 112 ,‘回收站管理‘, 107 union all
select 114 ,‘团购管理‘, 108 union all
select 115 ,‘拍卖管理‘, 108 union all
select 116 ,‘优惠管理‘, 108 union all
select 117 ,‘会员管理‘, 102 union all
select 118 ,‘会员卡管理‘, 102 union all
select 119 ,‘资金管理‘, 102 union all
select 120 ,‘管理员管理‘, 102 union all
select 121 ,‘添加管理员‘, 120 union all
select 122 ,‘修改管理员‘, 120
go

--查所有子结点
if object_id(‘f_getC‘) is not null drop function f_getC
go
create function f_getC(@id int)
returns @re table(id int,level int,sort varchar(10))
as
begin
    declare @l int
    set @l=0
    insert @re select @id,@l,null
    while @@rowcount>0
    begin
        set @[email protected]+1
        insert @re select a.modeid,@l,ltrim(isnull(b.sort,a.modeid)) from tb as a,@re as b
 where b.id=a.parentid and [email protected]
    end
    update @re set level = level -1
    return
end
go 

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

/*
modeid      parentid                                                       sort       level
----------- ----------- -------------------------------------------------- ---------- -----------
100         0           ┝商品管理                                              100        0
107         100           ┝商品管理                                            100        1
108         100           ┝明细管理                                            100        1
109         100           ┝物流管理                                            100        1
101         0           ┝定单管理                                              101        0
102         0           ┝用户管理                                              102        0
117         102           ┝会员管理                                            102        1
118         102           ┝会员卡管理                                           102        1
119         102           ┝资金管理                                            102        1
120         102           ┝管理员管理                                           102        1
104         0           ┝学院广告                                              104        0
105         0           ┝系统设置                                              105        0
106         0           ┝附件管理                                              106        0
110         107             ┝商品信息管理                                        100        2
111         107             ┝商品分类管理                                        100        2
112         107             ┝回收站管理                                         100        2
114         108             ┝团购管理                                          100        2
115         108             ┝拍卖管理                                          100        2
116         108             ┝优惠管理                                          100        2
121         120             ┝添加管理员                                         102        2
122         120             ┝修改管理员                                         102        2

(所影响的行数为 21 行)

*/

--查所有子结点,带路径与排序
if object_id(‘f_getC‘) is not null drop function f_getC
go
create function f_getC(@id int)
returns @re table(id int,level int,sort varchar(100),path varchar(500))
as
begin
    declare @l int
    set @l=0
    insert @re
 select [modeid],@l,right(‘00000‘+ltrim(modeid),5),modename
 from tb where [email protected]
    while @@rowcount>0
    begin
        set @[email protected]+1
        insert @re
  select a.modeid,@l,b.sort+right(‘00000‘+ltrim(a.modeid),5),
      b.path+‘ - ‘+a.modename
  from tb as a,@re as b
  where b.id=a.parentid and [email protected]
    end
    update @re set level = level
    return
end
go 

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

/*
modeid      parentid                         level
----------- ----------- -------------------- ----------- -------------------- ----------------------------------------
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 行受影响)

*/

----------

  

时间: 2024-08-08 01:16:55

SQL 递归树 子父节点相互查询的相关文章

根据父节点编号查询子节点名称,孙节点个数

新建一个部门表 DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '标识列', `name` varchar(255) NOT NULL COMMENT '名称', `pid` int(11) NOT NULL COMMENT '父级编号', `num` int(11) NOT NULL DEFAULT '100' COMMENT '排序号', PRIMA

树的父节点表示法及Java实现

类和模块 类的实现是基于继承机制的,如果两个类继承同一个原型对象,那么也就是说,也就意味着使用同一个构造函数来实例化,它们是同一个类的实例. 9.1类和原型 在javascript中,类的实例都是从同一个原型对象上继承属性,所以原型对象是类的核心. 9.2类和构造函数 构造函数是初始化新创建对象的函数. 构造函数的prototype属性被用作新对象的原型,因此,同一个构造函数的实例化的对象都继承自同一个对象. 9.3javasript中的java式的类继承 实例字段 实例方法 类字段 类方法 9

获取子父节点,tree树状结构的方式--通过循环的方式

1.导包 <dependencies> //将domain quary写到了这层 <dependency> <groupId>cn.xxx.aigou</groupId> <artifactId>qqq_product_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--springboot相关的依赖

递归解决根据父节点遍历权限树菜单的问题--------mysql数据中的树表

本人几乎没写过博客,感觉要学的知识和要做的事情太多,没时间.但发现用博客记录自己学习心得非常好,就抽时间写点,供自己以后参考也分享给某些需要的人,我水平有限,请多指教! 最近在独自尝试开发一个小型的oa系统以巩固下自己对java ssh框架的学习.这里记录下开发中的一些心得体会. 我把系统菜单设计成树,用一张表存储,各个菜单项之间是父子关系,当我们要根据用户权限去数据库中取菜单项时,发现sql语句不好解决.之前在网上查看了一些帖子博文,发现oracle中有对这个需求有专门的sql语句:类似这样

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是mssql和postgre,这个不需多讲,我们只讲讲单表情况下的postgre如何通过迭代查询获取有层级关系的数据. 一.表结构举例 MENU表 ID VARCHAR2(32)     N   sys_guid()    节点idFENXID VARCHAR2(32)

SqlServer 树结构数据 子节点父节点的查询

declare @t table (C_ID int,PcName varchar(6),ParentID int)insert into @tselect 1,'安徽',0 union allselect 2,'安庆',1 union allselect 3,'安庆市',2 union allselect 4,'怀宁县',2 union allselect 5,'潜山县',2 union allselect 6,'宿松县',2 union allselect 7,'太湖县',2 union a

sql 递归(查找一个节点下的所有节点)

--这是查找菜单 第一行是一级菜单,下面是二级菜单 with temp as ( select MenuCode,ParentCode,MenuName,URL,1 as curMenuLevel from sys_menu where (ParentCode is null or ParentCode = '') and MenuCode='pms' union all select a.MenuCode,a.ParentCode,a.MenuName,a.URL, b.curMenuLeve

Oracle父节点及其子节点数据的查询

Oracle语句如下: 使用方法:start with.....connect by prior.其中start with后面跟的条件1是父节点的查询条件,connect by prior后面跟的条件2是与记录的父节点相同的子节点中的数据. 示例: SELECT id, name as text, parent_id as parentId from TF_SYS_T_ACTION action where 1 = 1 and action.id in (select caction.actio

ORACLE 树形遍历查询根节点、父节点、子节点

1.准备演示数据 创建表结构: -- Create table createtable Z_ORG(  cid         NUMBER,  cname       VARCHAR2(32),  parent_id   NUMBER,  create_time DATE,  org_level   NUMBER) tablespace POWERDESK pctfree10 initrans1 maxtrans255; -- Add comments to the table comment