天天看点

级联查询 oracle 中connect by prior实现递归查询

对于大多数的程序员 遇到级联查询的概率很高  今儿写一下级联查询的sql  网上也有一些 我做一下 自己的总结

CREATE TABLE TBL_TEST

  (

  ID    NUMBER,

  NAME VARCHAR2(100 BYTE),

  PID   NUMBER                                  DEFAULT 0

  );

插入测试数据:

  INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');

  INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');

  INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');

  INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');

  INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');

--------------------------------------------------------------------------------------------------

    ID                NAME             PID

    1                    10                  0

    2                    11                  1

    3                    20                  0

    4                    12                  1

    5                    121                 2

----------------------------------------------------------------------------------------------------

       从Root往树末梢递归

  select * from TBL_TEST

  start with id=1

  connect by prior id = pid  

注:(start with id = 1  表示的是 以1为根节点的树  从跟到叶的查询 此查询语句 为 一颗树   , PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。 从而 判定 查询顺序 为 从跟到叶)

   查询结果

ID       NAME         PID

1          10                0

2          11                1

5          121              2

4          12                1

-----------------------------------------------------------------------------------------------------

  从末梢往树ROOT递归

  select * from TBL_TEST

  start with id=5

  connect by prior pid = id

 上一条记录的 父节点 为本记录的 节点   既 此查询出来的 为一颗倒树 既从叶到跟的顺序

运行结果:

ID         NAME          PID

5            12                 1

2            1                    1

1            1                    0

                                 本文 主要是对 http://www.poluoluo.com/jzxy/201004/81956.html  文章进行补充