树形结构

  其实树形关系与主从关系有点不同,在深度,依赖方面

    树形结构主要由三种表达方式:邻接模型,物化路径模型,嵌套模型

1.邻接模型 :每个节点记录其父节点的信息,比如ID

 数据库代码

create table Z_DIRECT(
id number primary key,
name varchar2(10),
parentid number
)
insert into Z_DIRECT values(1,'apache-tomcat-6.0.29',null);

insert into Z_DIRECT values(2,'bin',1);
insert into Z_DIRECT values(3,'conf',1);
insert into Z_DIRECT values(4,'webapps',1);

insert into Z_DIRECT values(5,'AlarmServer',4);
insert into Z_DIRECT values(6,'CarMgr',4);
insert into Z_DIRECT values(7,'docs',4);
insert into Z_DIRECT values(8,'examples',4);

insert into Z_DIRECT values(9,'WEB-INF',5);
insert into Z_DIRECT values(10,'index.jsp',5);
是以tomcat文件系统目录结构为例子

树遍历的时候,包括4层,因此需要4次连接查询

select '/'||nvl(t1.name,'')||'/'||nvl(t2.name,'')||'/'||nvl(t3.name,'')||'/'||nvl(t4.name,'') path
from z_direct t1,z_direct t2,z_direct t3,z_direct t4
where t1.id=t2.parentid(+) and t2.id=t3.parentid(+) and t3.id=t4.parentid(+) and t1.id=1
order by t1.name,t2.name,t3.name,t4.name

这样查询出来只显示叶子节点,而分支节点没有显示出来

如果想要查分支节点就要修改条件,修改层次

如果树的层次无法确定,也无法用一个SQL语句完成对树的遍历

不过Oracle针对这个模型提供了一个Connect语法

select level,lpad(' ',level*2-1)||'|'||name name
from z_direct
start with parentid is null
connect by prior id=parentid

这样文件目录就非常清楚了,如果想查询别的分支节点,只需要修改 start with  后面的条件

如果想要层次也清楚 就使用 select SYS_CONNECT_BY_PATH(name,'/') name

不过使用这个模型,有个麻烦的事情,当需要删除一个分支,单靠一个SQL语句是无法完成的,必须要写存储过程

posted @ 2011-06-28 18:09  我滴地盘在哪  阅读(464)  评论(0)    收藏  举报