树形结构
其实树形关系与主从关系有点不同,在深度,依赖方面
树形结构主要由三种表达方式:邻接模型,物化路径模型,嵌套模型
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);
树遍历的时候,包括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语句是无法完成的,必须要写存储过程
浙公网安备 33010602011771号