• SQL语句汇总Connect by


    1.树的使用(connect by)

    用例说明:

          ABZFLID0001  是 ID

    ABZFLID0002  是ID的上一级,父ID

     1.1 从父节点开始,查询树的所有层级节点数据 
     SELECT  SYS_CONNECT_BY_PATH (ABZFLID0001, '/')  PATHS, ABZFLID0001 AS ID, ABZFLID0002 AS PID,ABZFL0003,LEVEL as node_level     
     FROM KMCABZFL  
     START WITH ABZFLID0002 IS  NULL    --表示从父节点为空的数据开始,父节点为空,即该行数据没有父,那么说明该数据就是顶级父节点
     CONNECT BY ABZFLID0002 = PRIOR ABZFLID0001    ---PRIOR 与ID在同一侧,表示从父节点开始查询所有子节点数据
    ;

    --1.2 从当前节点开始,查询其所有子节点数据
     
     SELECT  SYS_CONNECT_BY_PATH (ABZFLID0001, '/')  PATHS, ABZFLID0001 AS ID,ABZFLID0002 AS PID, ABZFL0003
     FROM KMCABZFL  
     START WITH ABZFLID0001='424900'     ---表示从当前节点ID 开始
     CONNECT BY ABZFLID0002 = PRIOR ABZFLID0001   ---PRIOR 与ID在同一侧,表示从父节点开始查询所有子节点数据
    ;

     1.3从当前节点开始,查询其所有父节点数据
     
     SELECT  SYS_CONNECT_BY_PATH (ABZFLID0001, '/')  PATHS, ABZFLID0001,ABZFLID0002,ABZFL0003  
     FROM KMCABZFL  
     START WITH ABZFLID0001='425637'
     CONNECT BY PRIOR ABZFLID0002 =  ABZFLID0001  ---PRIOR 与PID在同一侧,表示从子节点开始,查询其所有层级的父ID
    ;

    2.举例
    表        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

  • 相关阅读:
    Python 标准库 urllib2 的使用细节
    为什么C++编译器不能支持对模板的分离式编译
    source insight插件
    tar命令
    绘制和重绘,有效矩形和无效矩形
    常量表达式
    区间迭代
    lambda函数
    decltype和新的返回值语法
    auto用法
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/798517.html
Copyright © 2020-2023  润新知