科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Oracle--树的使用(Connect By)

Oracle--树的使用(Connect By)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  表    tree   字段   master        sub        sales   insert into tree values   ('主1',   '主2',  15);    insert into tree values

作者:中国IT实验室 来源:中国IT实验室 2007年10月5日

关键字: 优化 数据库 ORACLE

  • 评论
  • 分享微博
  • 分享邮件

  表    tree
  字段   master
       sub
       sales
  insert 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 tree                
  start with sub='主2'     --相当于普通sql的where条件
  connect by prior master=sub; --遍历的顺序是sub先于master遍历,也就是说从sub往上遍历一直到master(根节点)
   2 
  MASTER   SUB       SALES
  ---------- ---------- ----------
  主1    主2        15
  
  
  SQL> select * from tree                
  start with master='主2'
  connect by prior master=sub; --sub往上遍历至根节点(参考一下树型图)              
   2  3 
  MASTER   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  3 
  SYS_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,主3
  start with sub='主5'
  connect by prior master=sub;
   2  3 
  SYS_CONNECT_BY_PATH(MASTER,'/')
  --------------------------------------------------------------------------------
  /主2
  /主2/主1
  /主3
  /主3/主1
  
  SQL> select sys_connect_by_path(MASTER,'/'),sub,master from tree  
  start with sub is not null
  connect by prior master=sub; 
   2  3 
  SYS_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    主1  
  select sys_connect_by_path(MASTER,'/'),sub,master from tree                
  start with sub is not null
  connect 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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章