首先和使用WITH做递归查询一样,给数据库表插入一定的数据。
查询结果为:
PARENTID ID NAME
111 1112 DB2文章1的评论2
11 111 DB2文章1
1 11 DB2
0 1 数据库开发
但是如果你的递归循环中出现了死循环,这条SQL就执行不了了。
如果你要忽略报错执行该SQL,可以使用NOCYCLE关键字,如下。
在CONNECT BY语句上面还可以增加一些辅助的伪列,如:
level:标记层级级数,最上层节点为1,之后为2、3……。
CONNECT_BY_ISCYCLE:标记此节点是否为某一个祖先节点的父节点,导致循环,1为是,0为否。
CONNECT_BY_ISLEAF :标记此节点是否为叶子节点,即没有子节点,1为是,0为否。
CONNECT_BY_ROOT:标记此节点的祖先节点,后面加列名或表达式,取祖先节点的记录值。
EXAMPLE:
CREATE TABLE BBS
(
PARENTID INTEGER NOT NULL,
ID INTEGER NOT NULL,
NAME VARCHAR(200) NOT NULL
);
insert into bbs (PARENTID,ID,NAME) values (0,1,'数据库开发');
insert into bbs (PARENTID,ID,NAME) values (1,11,'DB2');
insert into bbs (PARENTID,ID,NAME) values (11,111,'DB2 文章1');
insert into bbs (PARENTID,ID,NAME) values (111,1111,'DB2 文章1 的评论1');
insert into bbs (PARENTID,ID,NAME) values (111,1112,'DB2 文章1 的评论2');
insert into bbs (PARENTID,ID,NAME) values (11,112,'DB2 文章2');
insert into bbs (PARENTID,ID,NAME) values (1,12,'Oracle');
insert into bbs (PARENTID,ID,NAME) values (0,2,'Java 技术');
COMMIT;
select * from BBS
start with name = ‘DB2文章1的评论2’ --从某一个节点开始,进行向上递归
connect by prior PARENTID = ID; --连接条件
查询结果为:
PARENTID ID NAME
111 1112 DB2文章1的评论2
11 111 DB2文章1
1 11 DB2
0 1 数据库开发
但是如果你的递归循环中出现了死循环,这条SQL就执行不了了。
如果你要忽略报错执行该SQL,可以使用NOCYCLE关键字,如下。
INSERT INTO BBS(PARENTID,ID,NAME)VALUES(111,1,’DB2论文’);
select * from BBS
start with name = ‘DB2文章1的评论2’ --从某一个节点开始,进行向上递归
connect by prior PARENTID = ID; --连接条件
NOCYCLE
在CONNECT BY语句上面还可以增加一些辅助的伪列,如:
level:标记层级级数,最上层节点为1,之后为2、3……。
CONNECT_BY_ISCYCLE:标记此节点是否为某一个祖先节点的父节点,导致循环,1为是,0为否。
CONNECT_BY_ISLEAF :标记此节点是否为叶子节点,即没有子节点,1为是,0为否。
CONNECT_BY_ROOT:标记此节点的祖先节点,后面加列名或表达式,取祖先节点的记录值。
EXAMPLE:
select a.child,
a.PARENTID,
level "层次",
sys_connect_by_path(ID, '->') "合并层次",
prior a.PARENTID "父节点",
connect_by_root a.ID "根节点",
decode(connect_by_isleaf, 1, a.ID, null) "子节点",
decode(connect_by_isleaf, 1, '是', '否') "是否子节点"
from BBS a
start with name = ‘DB2文章1的评论2’ --从某一个节点开始,进行向上递归
connect by NOCYCLE prior PARENTID = ID; --连接条件