当前位置:Gxlcms > 数据库问题 > oracle分层查询中的start with和connect by(树结构查询)

oracle分层查询中的start with和connect by(树结构查询)

时间:2021-07-01 10:21:17 帮助过:7人阅读

  • from extern_dm_swjg  
  • connect by prior swjg_dm = sj_swjg_dm  
  • start with sj_swjg_dm is null  

  • 2. 关于PRIOR  运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。

    例2从节点开始自底向上查询 [sql] view plaincopy  
    1. select swjg_dm,swjg_mc,sj_swjg_dm,swjg_level  
    2. from extern_dm_swjg  
    3. connect by  swjg_dm =  prior sj_swjg_dm  
    4. start with swjg_dm = ‘16107100004‘  

    3.使用LEVEL      在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 
        在查询中,可以使用伪列LEVEL显示每行数据的有关层次。LEVEL将返回树型结构中当前节点的层次,我们可以使用LEVEL来控制对树型结构进行遍历的深度。   例3 显示表中的各行数据及层号。 [sql] view plaincopy  
    1. select level, swjg_dm,swjg_mc,sj_swjg_dm,swjg_level  
    2. from extern_dm_swjg  
    3. connect by prior swjg_dm = sj_swjg_dm  
    4. start with sj_swjg_dm is null  

    伪列LEVEL为数值型,可以在SELECT 命令中用于各种计算。 

    例4 使用LEVEL改变查询结果的显示形式。
    [sql] view plaincopy  
    1. select LPAD(LEVEL,LEVEL*3,‘ ‘) as "LEVEL", swjg_dm,swjg_mc,sj_swjg_dm,swjg_level  
    2. from extern_dm_swjg  
    3. connect by prior swjg_dm = sj_swjg_dm  
    4. start with sj_swjg_dm is null   

    在SELECT使用了函数LPAD,关于LPAD函数的使用,请参阅Oracal的Lpad函数 4.节点和分支的裁剪 
        在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

    例5  仅剪去了树中单个节点16107100003 扶风县国家税务局 [sql] view plaincopy  
    1. select LPAD(LEVEL,LEVEL*3,‘ ‘) as "LEVEL", swjg_dm,swjg_mc,sj_swjg_dm,swjg_level  
    2. from extern_dm_swjg  
    3. where swjg_dm !=‘16107100003‘  
    4. connect by prior swjg_dm = sj_swjg_dm  
    5. start with sj_swjg_dm is null  
    技术分享
     在这个查询中,仅剪去了树中单个节点swjg_dm为16107100003的,可它的子节点依然存在。若希望剪去树结构中的某个分支,  则要用CONNECT BY 子句。CONNECT BY 子句是限定树型结构中的整个分支,既要剪除分支上的单个节点,  也要剪除其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

    例6  除去节点16107100003的一支 [sql] view plaincopy  
    1. select LPAD(LEVEL,LEVEL*3,‘ ‘) as "LEVEL", swjg_dm,swjg_mc,sj_swjg_dm,swjg_level  
    2. from extern_dm_swjg  
    3. connect by prior swjg_dm = sj_swjg_dm  
    4. and swjg_dm !=‘16107100003‘  
    5. start with sj_swjg_dm is null  
    技术分享
        这个查询结果就与例5不同,除了剪去单个节点 16107100003 外,还将 16107100003 的子节点16107100004剪掉,即把 16107100003  这个分支剪掉了。 
        当然WHERE子句可以和CONNECT BY子句联合使用,这样能够同时剪掉单个节点和树中的某个分支。   在使用SELECT 语句来报告树结构报表时应当注意,CONNECT BY子句不能作用于出现在WHERE子句中的表连接。如果需要进行连接,可以先用树结构建立一个视图,再将这个视图与其他表连接,以完成所需要的查询。

    oracle分层查询中的start with和connect by(树结构查询)

    标签:

    人气教程排行