oracle处理父子节点关系,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_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 |
注意:所有的父节点和子节点的查询,都是包含自身节点的。
千总,是这样的。jQuery里面的“父子关系”,“兄弟关系“是基于html DOM节点的。
比如你的例子,
<div class="div" id=div1>
<font class="fount1">我是1!</font>
<div id=div2>
<font class="fount2">我是2!</font>
</div>
</div>
div1是html页面body下的一个子节点,而这个div1又有fount1,和div2这两个子节点,fount1和div2是兄弟关系,div2下面还有一个fount2节点 。
你要用jQuery去找什么父节点,子节点,首先要搞清楚这个节点在HTML中是什么关系,然后你才可以用parent(),child()这些方法。
下面是例子
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'test.jsp' starting page</title>
<script type="text/javascript" src="../js/jquery/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
alert($(".fount1").parents(".div").html());
alert($(".fount2").parents(".div").html());
});
</script>
</head>
<body>
<div class="div">
<font class="fount1">我是1!</font>
<div>
<font class="fount2">我是2!</font>
</div>
</div>
</body>
</html>...余下全文>>
以oracle中的scott用户下的部门表和员工表为例。
SELECT * FROM EMP;
SELECT * FROM DEPT;
SELECT D.DEPTNO, D.DNAME, D.LOC, WMSYS.WM_CONCAT(E.EMPNO)
FROM DEPT D, EMP E
WHERE D.DEPTNO = E.DEPTNO
GROUP BY D.DEPTNO, D.DNAME, D.LOC;
可以将员工编号合并为一条,其中e.empno可以替换成其他字段。
有什么不明白再接着问。