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

commentontable Z_ORG  is‘机构组织简化表‘;

-- Add comments to the columns

commentoncolumn Z_ORG.cid  is‘主键ID‘;

commentoncolumn Z_ORG.cname  is‘组织名称‘;

commentoncolumn Z_ORG.parent_id  is‘上级组织ID‘;

commentoncolumn Z_ORG.create_time  is‘创建时间‘;

commentoncolumn Z_ORG.org_level  is‘组织级别‘;

录入数据:


insertinto z_org(cid,cname,parent_id,create_time,org_level) select1,‘地球‘,0,sysdate,1from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select2,‘中国‘,1,sysdate,2from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select3,‘上海直辖市‘,2,sysdate,3from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select4,‘江苏省‘,2,sysdate,3from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select5,‘南京市‘,4,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select6,‘苏州市‘,4,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select7,‘无锡市‘,4,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select8,‘虹口区‘,3,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select9,‘浙江省‘,2,sysdate,3from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select10,‘杭州市‘,9,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select11,‘宁波市‘,9,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select12,‘美国‘,1,sysdate,2from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select13,‘加利福尼亚州‘,12,sysdate,3from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select14,‘旧金山市‘,13,sysdate,4from dual;

insertinto z_org(cid,cname,parent_id,create_time,org_level) select15,‘撒门市‘,13,sysdate,4from dual;

commit;

2、遍历根节点

1.  select  code1 from tablename

2.  start with code2

3.  connect by code3

4.  where cond3

code2是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

code3是连接条件,其中用prior表示上一条记录,比如connect by prior id=parentid就是说上一条记录的id是本条记录的parent,即本记录的父亲是上一条记录。

code4是过滤条件,用于对返回的所有记录进行过滤。


prior和start with关键字是可选项:

prior运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,prior运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

遍历表,求得某一个节点的所有上级节点记录,比如求得撒门市的上级组织,应该获得加利福尼亚州,美国,地球这些记录,如下所示:


SQL>     select t.cid, t.cname, t.parent_id,level

2      from z_org t

3      startwith t.cname=‘撒门市‘

4      connectbynocycleprior t.parent_id=t.cid

5      orderbylevelasc

6  ;

CID CNAME                             PARENT_ID      LEVEL

---------- -------------------------------- ---------- ----------

15撒门市                                   13          1

13加利福尼亚州                             12          2

12美国                                      1          3

1地球                                      0          4

SQL>

遍历求得根路径字符串:


SQL>   select cname_child, wm_concat(t2.cname)

2    from(

3      select‘苏州市‘ cname_child, t.cid, t.cname, t.parent_id,level

4      from z_org t

5      startwith t.cname in(‘苏州市‘)

6      connectbynocycleprior t.parent_id=t.cid

7    )t2 groupby cname_child ;

CNAME_CHILD WM_CONCAT(T2.CNAME)

----------- --------------------------------------------------------------------------------

苏州市      苏州市,地球,中国,江苏省

SQL>

3、遍历子节点

5.  select  code1 from tablename

6.  start with code2

7.  connect by code3

8.  where cond3

code2是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

code3是连接条件,其中用prior表示上一条记录,比如connect by prior id=parentid就是说上一条记录的id是本条记录的parent,即本记录的父亲是上一条记录。

code4是过滤条件,用于对返回的所有记录进行过滤。


prior和start with关键字是可选项:

prior运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,prior运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。
start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

如下所示,prior偏向父节点,就往下查询,查询节点下面所有的子节点记录:


select t1.parent_id, t1.cid, casewhenlevel=1then‘*‘||t1.cname whenlevel=2then‘*-----‘||t1.cname whenlevel=3then‘*-----*-----‘||t1.cname else t1.cname end , level

from z_org t1

startwith t1.parent_id = 1

connectby  t1.cid=prior t1.parent_id

;

如下所示E:\u\oracle\problem\pic\52.png:

如下所示,prior偏向子节点,就往下查询,查询节点下面所有的子节点记录:


select t1.parent_id, t1.cid, casewhenlevel=1then‘*‘||t1.cname whenlevel=2then‘*-----‘||t1.cname whenlevel=3then‘*-----*-----‘||t1.cname else t1.cname end , level

from z_org t1

startwith t1.parent_id = 1

connectbyprior t1.cid=t1.parent_id

;

执行结果如下所示E:\u\oracle\problem\pic\51.png:

4、扩展研究

---从parentid到cid开始递归,并以parentid为主展示这条记录
select t1.parentid, t1.cid, level
from test_category t1
start with t1.parentid = 1
connect by prior t1.parentid = t1.cid
;
---从parentid到cid开始递归,并以parentid为主展示这条记录
select t1.parentid, t1.cid, level
from test_category t1
start with t1.cid = 1
connect by prior t1.parentid = t1.cid
;

---从parentid到cid开始递归,并以cid为主展示这条记录
select t1.cid, t1.parentid, level
from test_category t1
start with t1.parentid = 1
connect by t1.parentid = prior t1.cid
;
---从parentid到cid开始递归,并以cid为主展示这条记录
select t1.cid, t1.parentid, level
from test_category t1
start with t1.cid = 1
connect by t1.parentid = prior t1.cid
;

时间: 2024-10-22 19:05:11

ORACLE 树形遍历查询根节点、父节点、子节点的相关文章

EasyUI treegrid 实现点击父节点加载子节点

今天在项目中遇到问题,要实现 EasyUI   treegrid 实现点击父节点加载子节点 第一反应是去百度一下,谷歌一下,发现网上的回答不是懒加载就是在onBeforeExpand调用append方法 我决定使用第二种方法,定义treegrid的onBeforeExpand方法,在里面调用appen方法. 然而当我兴冲冲的运行的时候,出问题了, Firefox出现too much recursion异常提示 在网上看了一下这个问题的出现原因,大家都说是,非法使用了js关键字,可是我看了几遍代码

winform treeview 通过节点名称添加子节点

/// <summary> /// 添加人员节点(利用TreeNodeCollection) /// </summary> /// <param name="tnc">TreeNodeCollection(TreeView的节点集合)</param> /// <param name="pid_val">父id的值</param> /// <param name="id"

删除TreeView节点以及其子节点

//1.删除TreeView节点以及其子节点procedure TForm2.Button1Click(Sender: TObject);var TreeNode:TTreeNode;begin  if TreeView1.Selected <> Nil then  Begin    TreeNode := TreeView1.Selected.getFirstChild;    while TreeNode <> nil do    begin      TreeNode.Del

一文带你彻底明白如何实现动态添加子节点及修改子节点属性

? 终于看完了官方的教程,开始用 Cocos Creator 做第一个游戏——<消灭病毒-重力版>(PS:等做完之后会出一个完整的教程,敬请期待┗( ▔, ▔ )┛!),可是第一步就遇到了坑,本来想动态的通过预制件来添加病毒节点,并修改病毒的血量,可是添加节点之后无论如何都不能对节点的属性进行修改,查了半天资料原来是没有获取子节点的组件,白白浪费了两个小时,这就是自学的弊端吧,有一个好的老师真的是太重要了!为了让大家少走弯路,今天写一个 Demo 来教大家如何实现动态添加子节点及修改子节点属性

Oracle中遍历查询下属部门信息

一条人员信息记录中,含有部门标杆信息unified_code,以及父部门标杆编码parent_org_unified_code,现在需要查询一个部门及其下属部门,SQL语句如下: 1 select de.dept_name,de.unified_code 2 from cimsuser.t_org_department de 3 start with de.unified_code= 'DP00004' 4 connect by prior de.unified_code = de.parent

SQL查询父节点下的所有子节点(包括子节点下的子节点,无限子节点)

-->Title:Generating test data -->Author:wufeng4552 -->Date :2009-09-30 08:52:38 set nocount on if object_id('tb','U')is not null drop table tb go create table tb(ID int, ParentID int) insert into tb select 1,0 insert into tb select 2,1 insert int

zTree中父节点禁用,子节点可以用

参考学习网址:http://www.treejs.cn/v3/main.php#_zTreeInfo axios.get('/base/unit/unittree') .then((response) => { let { meta, data } = response.data; if (meta.success) { if (data && data.unitList) { // 部门树数据配置 let unitList = data.unitList; self.unitLis

TreeView控件点击父节点同时选择子节点JS脚本

1 <script language="javascript" type="text/javascript"> 2 function client_OnTreeNodeChecked() { 3 var obj = window.event.srcElement; 4 var treeNodeFound = false; 5 var checkedState; 6 if (obj.tagName == "INPUT" &&am

找到父节点下的所有子节点(包括子节点)

  CREATE TABLE `tab_menu` ( `MU_ID` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键', `MU_NAME` varchar(255) NOT NULL COMMENT '菜单名', `MU_CODE` varchar(100) DEFAULT NULL COMMENT '菜单编码', `MU_CHAIN_NAME` varchar(255) NOT NULL COMMENT '菜单全名', `MU_PARENT_ID`