表 tree字段 mastersubsalesinsert into tree values('主1', '主2', 15);insert into tree values('主1', '主3', 20);insert into tree values('主2', '主4', 5);insert into tree values('主2', '主5', 10);insert into tree values('主3', '主5', 30);insert into tree values('主3', '主6', 40);SQL> select * from tree;MASTER SUB SALES---------- ---------- ----------主1 主2 15主1 主3 20主2 主4 5主2 主5 10主3 主5 30主3 主6 40如果用树型结构表示如下:'主1'-'主2'--'主4'--'主5''主1'-'主3'--'主5'--'主6'SQL> select * from treestart with sub='主2' --相当于普通sql的where条件connect by prior master=sub; --遍历的顺序是sub先于master遍历,也就是说从sub往上遍历一直到master(根节点)2MASTER SUB SALES---------- ---------- ----------主1 主2 15SQL> select * from treestart with master='主2'connect by prior master=sub; --sub往上遍历至根节点(参考一下树型图)2 3MASTER SUB SALES---------- ---------- ----------主2 主4 5 --这条是自己本身,也就是第一遍遍历主1 主2 15 --这是第2次遍历,我们从树型图可以看到,'主2'往上遍历是'主1'主2 主5 10主1 主2 15好,我们关看上面可能还是不好理解,我们加入一个树结构专用函数sys_connect_by_path,便于理解SQL> select sys_connect_by_path(MASTER,'/') from tree --master表示我遍历的起点只找在master列中存在的,如下例只要'主2'为起点,并以/为分割符start with master='主2'connect by prior master=sub; --往根节点遍历2 3SYS_CONNECT_BY_PATH(MASTER,'/')--------------------------------------------------------------------------------/主2 --第1遍遍历/主2/主1 --第2遍遍历/主2 --第2条master='主2'的记录的第1次遍历/主2/主1 --第2条master='主2'的记录的第2次遍历SQL> select sys_connect_by_path(MASTER,'/') from tree --起点为sub='主5'时MASTER=主2,主3start with sub='主5'connect by prior master=sub;2 3SYS_CONNECT_BY_PATH(MASTER,'/')--------------------------------------------------------------------------------/主2/主2/主1/主3/主3/主1SQL> select sys_connect_by_path(MASTER,'/'),sub,master from treestart with sub is not nullconnect by prior master=sub;2 3SYS_CONNECT_BY_PATH(MASTER,'/' SUB MASTER------------------------------ ---------- ----------/主1 主2 主1 --找主1到根的路径,这里根是主1他自己/主1 主3 主1/主2 主4 主2/主2/主1 主2 主1 --找主2到根的路径,这里根是主1/主2 主5 主2/主2/主1 主2 主1/主3 主5 主3/主3/主1 主3 主1/主3 主6 主3/主3/主1 主3 主1select sys_connect_by_path(MASTER,'/'),sub,master from treestart with sub is not nullconnect by prior sub = master;SYS_CONNECT_BY_PATH(MASTER,'/' SUB MASTER------------------------------ ---------- ----------/主1 主2 主1/主1/主2 主4 主2/主1/主2 主5 主2/主1 主3 主1/主1/主3 主5 主3/主1/主3 主6 主3/主2 主4 主2/主2 主5 主2/主3 主5 主3/主3 主6 主3
oracle的树函数,【PL/SQL】Oracle--树的使用(Connect By)
最新推荐文章于 2021-04-09 09:14:39 发布