| 副标题[/!--empirenews.page--] 
        
            
 一、Oracle中start with…connect by prior子句用法 
 
 
 connect by 是结构化查询中用到的,其基本语法是:
 select … from tablename 
 
 
 start with 条件1
 connect by 条件2
 where 条件3;
 例:
 select * from table
 start with org_id = ‘HBHqfWGWPy’
 connect by prior org_id = parent_id;
 ???????? 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
 org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 
 
  ??????? 用上述语法的查询可以取得这棵树的所有记录。
 ??????? 其中:
 ??????? 条件1?是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
 ??????? 条件2?是连接条件,其中用 
 PRIOR表示上一条记录,比如? 
 CONNECT BY? 
 PRIOR org_id = parent_id;就是说 
 上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
 ???????? 
 条件3?是过滤条件,用于对返回的所有记录进行过滤。
 ??????? 简单介绍如下:
 ??????? 在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:
 ??????? 第一步:从根节点开始;
 ??????? 第二步:访问该节点;
 ??????? 第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;
 ??????? 第四步:若该节点为根节点,则访问完毕,否则执行第五步;
 ??????? 第五步:返回到该节点的父节点,并执行第三步骤。
 ??????? 总之:扫描整个树结构的过程也即是 
 中序遍历树的过程。
 ?1.树结构的描述
 ??????? 树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。
 ???????? 在SELECT命令中使用CONNECT BY 和START WITH 子句可以查询表中的树型结构关系。其命令格式如下:
 SELECT . . .
 CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}
 [START WITH];
 ?????? 其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIOR运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系, 
 PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。 
 
  ???????? 在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
 ???????? START WITH:不但可以指定一个根节点,还可以指定多个根节点。
 2.关于PRIOR
 ??????? 运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。
 ??????? PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如:
 ???????? CONNECT BY PRIOR EMPNO=MGR
 ???????? PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如:
 ???????? CONNECT BY EMPNO=PRIOR MGR
 ???????? 在这种方式中也应指定一个开始的节点。
 3.定义查找起始节点
 ????????在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。
 4.使用LEVEL
 ??????? 在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。图1.2就表示了树结构的层次。
 5.节点和分支的裁剪
 ???????? 在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。
 6.排序显示
 ?????????象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。 
 
  ? 
 
  二、例子 
 
  ?
 1、准备测试表和测试数据 | 
 
       
         1 
        
       
         2 
        
       
         3 
        
       
         4 
        
       
         5 
        
       
         6 
        
       
         7 
        
       
         8 
        
       
         9 
        
       
         10 
        
       
         11 
        
       
         12 
        
       
         13 
        
       
         14 
        
       
         15 
        
       
         16 
        
       
         17 
        
       
         18 
        
       
         19 
        
       
         20 
        
       
         21 
        
       
         22 
        
       
         23 
        
       
         24 
        
       
         25 
        
       
         26 
        
       
         27 
        
       
         28 
        
       
         29 
        
       
         30 
        
       
         31 
        
       
         32 
        
       
         33 
        
       
         34 
        
       
         35 
        
       
         36 
        
       
         37 
        
       
         38 
        
       
         39 
        
       
         40 
        
       
         41 
        
       
         42 
        
       
         43 
        
       
         44 
        
       
         45 
        
       
         46 
        
       
         47 
        
       
         48 
        
       
         49 
        
       
         50 
        
       
         51 
        
       
         52 
        
       
         53 
        
       
         54 
        
       
         55 
        
       
         56 
        
       
         57 
        
       
         58 
        
       
         59 
        
       
         60 
        
       
         61 
        
       
         62 
        
       
         63 
        
       
         64 
         
       
        
         
          
         
         
         create? 
         table? 
         tb_menu( 
         
         
            id     number(10)  
         not? 
         null 
         , 
          
         
         
            title  varchar2(50), 
          
         
         
            parent number(10)  
          
         
         
         ) 
         
        
          ? 
         
         
          
         
         
         insert? 
         into? 
         tb_menu(id,title,parent)  
         values 
         (1, 
         ‘父菜单1‘ 
         , 
         null 
         ); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (2, 
         ‘父菜单2‘ 
         , 
         null 
         ); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (3, 
         ‘父菜单3‘ 
         , 
         null 
         ); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (4, 
         ‘父菜单4‘ 
         , 
         null 
         ); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (5, 
         ‘父菜单5‘ 
         , 
         null 
         ); 
         
         
          
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (6, 
         ‘一级菜单6‘ 
         ,1); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (7, 
         ‘一级菜单7‘ 
         ,1); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (8, 
         ‘一级菜单8‘ 
         ,1); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (9, 
         ‘一级菜单9‘ 
         ,2); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (10, 
         ‘一级菜单10‘ 
         ,2); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (11, 
         ‘一级菜单11‘ 
         ,2); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (12, 
         ‘一级菜单12‘ 
         ,3); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (13, 
         ‘一级菜单13‘ 
         ,3); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (14, 
         ‘一级菜单14‘ 
         ,3); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (15, 
         ‘一级菜单15‘ 
         ,4); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (16, 
         ‘一级菜单16‘ 
         ,4); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (17, 
         ‘一级菜单17‘ 
         ,4); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (18, 
         ‘一级菜单18‘ 
         ,5); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (19, 
         ‘一级菜单19‘ 
         ,5); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (20, 
         ‘一级菜单20‘ 
         ,5); 
         
         
          
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (21, 
         ‘二级菜单21‘ 
         ,6); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (22, 
         ‘二级菜单22‘ 
         ,6); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (23, 
         ‘二级菜单23‘ 
         ,7); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (24, 
         ‘二级菜单24‘ 
         ,7); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (25, 
         ‘二级菜单25‘ 
         ,8); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (26, 
         ‘二级菜单26‘ 
         ,9); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (27, 
         ‘二级菜单27‘ 
         ,10); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (28, 
         ‘二级菜单28‘ 
         ,11); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (29, 
         ‘二级菜单29‘ 
         ,12); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (30, 
         ‘二级菜单30‘ 
         ,13); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (31, 
         ‘二级菜单31‘ 
         ,14); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (32, 
         ‘二级菜单32‘ 
         ,15); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (33, 
         ‘二级菜单33‘ 
         ,16); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (34, 
         ‘二级菜单34‘ 
         ,17); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (35, 
         ‘二级菜单35‘ 
         ,18); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (36, 
         ‘二级菜单36‘ 
         ,19); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (37, 
         ‘二级菜单37‘ 
         ,20); 
         
         
          
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (38, 
         ‘三级菜单38‘ 
         ,21); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (39, 
         ‘三级菜单39‘ 
         ,22); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (40, 
         ‘三级菜单40‘ 
         ,23); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (41, 
         ‘三级菜单41‘ 
         ,24); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (42, 
         ‘三级菜单42‘ 
         ,25); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (43, 
         ‘三级菜单43‘ 
         ,26); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (44, 
         ‘三级菜单44‘ 
         ,27); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (45, 
         ‘三级菜单45‘ 
         ,28); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (46, 
         ‘三级菜单46‘ 
         ,28); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (47, 
         ‘三级菜单47‘ 
         ,29); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (48, 
         ‘三级菜单48‘ 
         ,30); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (49, 
         ‘三级菜单49‘ 
         ,31); 
         
         
         insert? 
         into? 
         tb_menu(id,parent)  
         values 
         (50, 
         ‘三级菜单50‘ 
         ,31); 
         
         
         commit 
         ; 
         
        
          ? 
         
         
         select? 
         *  
         from? 
         tb_menu; 
         
         
     
 
  
 parent字段存储的是上级id,如果是顶级父节点,该parent为null(得补充一句,当初的确是这样设计的,不过现在知道,表中最好别有null记录,这会引起全文扫描,建议改成0代替)。
 
 2、树操作
我们从最基本的操作,逐步列出树查询中常见的操作,所有查询出来的节点以家族中的辈份作比方。
 
 
                                                (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!