共计 1405 个字符,预计需要花费 4 分钟才能阅读完成。
通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的。而当我们使用 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_ID | ID |
1 |
| 1 |
2 | 1 | 1-1 |
3 | 1 | 1-2 |
4 | 1-1 | 1-1-1 |
5 | 1-1 | 1-1-2 |
6 | 1-2 | 1-2-1 |
4. 创建视图(这一步最重要)
create or replace view tmp_node_view as
select distinct level lvl,connect_by_root(id) leaf_id,t.*
from tmp_node t
connect by prior t.p_id = t.id;
5. 查看视图数据
select * form tmp_node_view order by leaf_id,lvl;
编号 | LVL | LEAF_ID | ID | P_ID |
1 | 1 | 1 | 1 |
|
2 | 1 | 1-1 | 1-1 | 1 |
3 | 2 | 1-1 | 1 |
|
4 | 1 | 1-1-1 | 1-1-1 | 1-1 |
5 | 2 | 1-1-1 | 1-1 | 1 |
6 | 3 | 1-1-1 | 1 |
|
7 | 1 | 1-1-2 | 1-1-2 | 1-1 |
8 | 2 | 1-1-2 | 1-1 | 1 |
9 | 3 | 1-1-2 | 1 |
|
10 | 1 | 1-2 | 1-2 | 1 |
11 | 2 | 1-2 | 1 |
|
12 | 1 | 1-2-1 | 1-2-1 | 1-2 |
13 | 2 | 1-2-1 | 1-2 | 1 |
14 | 3 | 1-2-1 | 1 |
|
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’;
编号 | LVL | LEAF_ID | ID | P_ID |
1 | 1 | 1-2-1 | 1-2-1 | 1-2 |
2 | 3 | 1-2-1 | 1 |
|
3 | 2 | 1-2-1 | 1-2 | 1 |
当须要知道一个节点有哪些子节点的时候。仅仅须要依据 id 查询 leaf_id 就可以:
select * from tmp_node_view where id = ‘1-2’;
编号 | LVL | LEAF_ID | ID | P_ID |
1 | 1 | 1-2 | 1-2 | 1 |
2 | 2 | 1-2-1 | 1-2 | 1 |
注意:发现所有的父母和孩子节点。包括自身节点是。
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/137318.htm