Start with connect by prior 递归 树查询

来源:互联网 发布:win7网络连接不可用 编辑:程序博客网 时间:2024/06/05 08:31

oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:

  select * from tablename

        start with cond1

  connect by cond2

  where cond3;

简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:

  id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。

  用上述语法的查询可以取得这棵树的所有记录。

   start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

  其中cond1是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

       connect by子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。

  COND2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。

      其中:PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。

  COND3是过滤条件,用于对返回的所有记录进行过滤。

Start with...ConnectBy子句递归查询一般用于一个表维护树形结构的应用。
创建示例表:
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');
 
从Root往树末梢递归
select * from TBL_TEST
 start with id=1
 connect by prior id = pid
 order by pid
 
从末梢往树ROOT递归
select * from TBL_TEST
 start with id=5
 connect by prior pid = id
 order by id

 

**************************************************************************

CREATE TABLE xxuts_test_start
(
 ID   varchar2(100),
  NAME  VARCHAR2(100)
);

 

select id,name,level fromxxuts_test_start
start with id='A'
connect by prior name=id
order by id

 

id    name   level
         1
         1
         1
         2
         2
         2
         3
 
原创粉丝点击