Welcome 微信登录

首页 / 数据库 / MySQL / Oracle处理节点之间的父子关系

通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的。而当我们使用Oracle当数据库,我们可以有一个简单的解决方法,例如下列:1.首先创建一张表。保存父子关系drop table tmp_node;create table tmp_node(id varchar2(500),p_id varchar2(500));2.向表中插入数据insert into tmp_node(p_id,id) values(null,1);insert into tmp_node(p_id,id) values(1,"1-1");insert into tmp_node(p_id,id) values(1,"1-2");insert into tmp_node(p_id,id) values("1-1","1-1-1");insert into tmp_node(p_id,id) values("1-1","1-1-2");insert into tmp_node(p_id,id) values("1-2","1-2-1");3.查看表中数据select * from tmp_node;
编号P_IDID
1 1
211-1
311-2
41-11-1-1
51-11-1-2
61-21-2-1
4.创建视图(这一步最重要)create or replace view tmp_node_view asselect distinct level lvl,connect_by_root(id) leaf_id,t.*from tmp_node tconnect by prior t.p_id = t.id;5.查看视图数据select  * form tmp_node_view order by leaf_id,lvl;
编号LVLLEAF_IDIDP_ID
1111 
211-11-11
321-11 
411-1-11-1-11-1
521-1-11-11
631-1-11 
711-1-21-1-21-1
821-1-21-11
931-1-21 
1011-21-21
1121-21 
1211-2-11-2-11-2
1321-2-11-21
1431-2-11 
6.使用说明主要使用的leaf_id和id两个字段的值。字段说明:lvl字段代表节点的深度,leaf_id代表叶节点。p_id父节点id。id节点本生id。当须要知道一个节点有哪些父节点的时候,仅仅须要依据leaf_id,查询id字段就可以:select * from tmp_node_view where leaf_id = "1-2-1";
编号LVLLEAF_IDIDP_ID
111-2-11-2-11-2
231-2-11 
321-2-11-21
当须要知道一个节点有哪些子节点的时候。仅仅须要依据id查询leaf_id就可以:select * from tmp_node_view where id = "1-2";
编号LVLLEAF_IDIDP_ID
111-21-21
221-2-11-21
注意:发现所有的父母和孩子节点。包括自身节点是。 更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址