表tree
字段master
sub
sales
insert into tree values
(主 主 );
insert into tree values
(主 主 );
insert into tree values
(主 主);
insert into tree values
(主 主 );
insert into tree values
(主 主 );
insert into tree values
(主 主 );
SQL> select * from tree;
MASTER SUB SALES
主主
主主
主主
主主
主主
主主
如果用树型结构表示如下:
主
主
主
主
主
主
主
主
SQL> select * from tree
start with sub=主相当于普通sql的where条件
connect by prior master=sub;遍历的顺序是sub先于master遍历也就是说从sub往上遍历一直到master(根节点)
MASTER SUB SALES
主主
SQL> select * from tree
start with master=主
connect by prior master=sub; sub往上遍历至根节点(参考一下树型图)
MASTER SUB SALES
主主 这条是自己本身也就是第一遍遍历
主主 这是第次遍历我们从树型图可以看到主往上遍历是主
主主
主主
好我们关看上面可能还是不好理解我们加入一个树结构专用函数sys_connect_by_path便于理解
SQL> select sys_connect_by_path(MASTER/) from tree master表示我遍历的起点只找在master列中存在的如下例只要主为起点并以/为分割符
start with master=主
connect by prior master=sub; 往根节点遍历
SYS_CONNECT_BY_PATH(MASTER/)
/主第遍遍历
/主/主第遍遍历
/主第条master=主的记录的第次遍历
/主/主第条master=主的记录的第次遍历
SQL> select sys_connect_by_path(MASTER/) from tree 起点为sub=主时MASTER=主主
start with sub=主
connect by prior master=sub;
SYS_CONNECT_BY_PATH(MASTER/)
/主
/主/主
/主
/主/主
SQL> select sys_connect_by_path(MASTER/)submaster from tree
start with sub is not null
connect by prior master=sub;
SYS_CONNECT_BY_PATH(MASTER/ SUBMASTER
/主 主主找主到根的路径这里根是主他自己
/主 主主
/主 主主
/主/主 主主找主到根的路径这里根是主
/主 主主
/主/主 主主
/主 主主
/主/主 主主
/主 主主
/主/主 主主
select sys_connect_by_path(MASTER/)submaster from tree
start with sub is not null
connect by prior sub = master;
SYS_CONNECT_BY_PATH(MASTER/ SUBMASTER
/主 主主
/主/主 主主
/主/主 主主
/主 主主
/主/主 主主
/主/主 主主
/主 主主
/主 主主
/主 主主
/主 主主