3.2 CONNECT_BY_ISLEAF
在oracle9i的时候,查找指定root 下的叶子节点,是很复杂的,oracle10g引入了一个新的函数,connect_by_isleaf,如果行的值为0 表示不是叶子节点,1表示是叶子节点。
找出s_emp 中找出manager_id=2 开始的行为root,表示叶子节点和非叶子节点,那么语句如下:
无限层次树形笔记本select level,
id,
无限层次树形笔记本manager_id,
last_name,
title,
无限层次树形笔记本(case --使用case表达式判断是否是叶子节点
when connect_by_isleaf = 1 then
叶子
else
不是叶子
无限层次树形笔记本 end) isleaf
from s_emp
start with manager_id = 2
connect by prior id = manager_id;
3.3 CONNECT_BY_ISCYCLE和NOCYCLE关键字
如果从root 节点开始找其子孙,找到一行,结果发生和祖先互为子孙的情况,则发生循环,oracle会报ORA-01436: CONNECT BY loop in user data,在9i 中只能将发生死循环的不加入到树中或删除,在10g中可以用nocycle 关键字加在connect by之后,避免循环的参加查询操作。并且通过connect_by_iscycle得到哪个节点发生循环。0表示未发生循环,1表示发生了循环,如:
create table family1(
fatherid number,
childid number
);
insert into family1 values(null,1);
无限层次树形笔记本 insert into family1 values(1,2);--父节点为1
insert into family1 values(1,3);
insert into family1 values(2,4);--发生循环
insert into family1 values(4,1);--子节点为1
insert into family1 values(4,5);
commit;
select connect_by_iscycle, fatherid,childid,sys_connect_by_path(childid,/)
from family1
start with fatherid is null
connect by nocycle prior childid=fatherid;
结果是:
3.4 CONNECT_BY_ROOT
下一篇:asp跨平台部署
文章地址:https://www.tianxianmao.com/article/other/xmdsoraclegxztx.html