Oralce之Connect By

         昨天去了一个本没有看中的公司面试,结果自己被秒了,特此记录一下,看来在使用Oracle过程中仍有不少需要学习的。

      Connec by start with:Oralce的递归查询(层级结构树)

     简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: 
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 
     用上述语法的查询可以取得这棵树的所有记录。 
     其中: 
     条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 
     条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 
     条件3 是过滤条件,用于对返回的所有记录进行过滤。 

     简单介绍如下: 
     早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 
     第一步:从根节点开始; 
     第二步:访问该节点; 
     第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步; 
     第四步:若该节点为根节点,则访问完毕,否则执行第五步; 
     第五步:返回到该节点的父节点,并执行第三步骤。 

     总之:扫描整个树结构的过程也即是中序遍历树的过程。 

      列子:

      start with ... connect by 用法讲解:

   构建如下table:
   ID   NAME  PID
   1    10     0
   2    11     1
   3    20     0
   4    12     1
   5    121   2
 code example1:

    select TBL_TEST.*, level from TBL_TEST

    start with pid= 1 -- 可写到 connect by 后面

    connect by prior pid = id

    ID   NAME PID LEVEL 
    2    11    1    1
    1    10    0    2
    4    12    1    1
    1    10    0    2

    code example2:

    select TBL_TEST.*, level from TBL_TEST

    start with id = 5 -- 可写到 connect by 后面

    connect by prior pid = id

 ID  NAME PID LEVEL 
    5     121    2        1
    2     11      1        2
    1     10     0         3

 
  说明:
    1、先从start with pid=1 句开始查询 得到 2   11   1   1 =====> level置1;
    2、根据pid = id,查询 id=1 句,得到 1   10   0   2 =====> level置2;
    3、根据pid = id,查询 id=0 句,未查询到后结束该树枝;

    注:prior pid = id 句说明 pid是id的父节点,通过pid查询id

你可能感兴趣的:(Oralce之Connect By)