ORACLE递归查询遍历详解

Oracle 实在太强了,本篇文章详细介绍了Oracle的递归查询语法,利用此语法,可以方便地实现递归的双向查询:

  -- Tirle        : Recursion query for TREE with "connect by/start with"

  -- Author       : Rake Gao

  -- Create Date : 2005-08-22

  -- Version      : 2.0

  -- Last Modify : 2005-08-22

  目 录

  一、测试准备

  二、实现各种查询要求

  三、要点总结

  正 文

  一、测试准备

  1、先假设有如下部门结构。

  1

  / /

  2    3

  //    /|/

  4 5 6 7 8

  2、然后建立测试表和数据。

  drop table t_dept_temp;

  create table t_dept_temp(

  DEPT_ID    NUMBER(2)    NOT NULL,

  PARENT_ID NUMBER(2)    ,

  DEPT_NAME VARCHAR2(10) ,

  AMOUNT     NUMBER(3)           --人数

  );

  delete t_dept_temp;

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (1,null,'1'    ,2);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (2,1   ,'1-2' ,15);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (3,1   ,'1-3' ,8);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (4,2   ,'1-2-4',10);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (5,2   ,'1-2-5',9);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (6,3   ,'1-3-6',17);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (7,3   ,'1-3-7',5);

  insert into t_dept_temp (DEPT_ID,PARENT_ID,DEPT_NAME,AMOUNT) values (8,3   ,'1-3-8',6);

  commit;

  SQL> select * from t_dept_temp;

  DEPT_ID PARENT_ID DEPT_NAME AMOUNT

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

  1           1               2

  2         1 1-2            15

  3         1 1-3             8

  4         2 1-2-4          10

  5         2 1-2-5           9

  6         3 1-3-6          17

  7         3 1-3-7           5

  8         3 1-3-8           6

  3、调整一下输出格式

  col DEPT_ID format A10;

  二、接下来实现各种查询要求

  1、部门2及其所有下级部门。

  SELECT LPAD(' ',2*(LEVEL - 1), ' ')||DEPT_ID AS DEPT_ID,

  PARENT_ID,DEPT_NAME,AMOUNT

  FROM t_dept_temp

  CONNECT BY PARENT_ID = PRIOR DEPT_ID -- 找出所有PARENT_ID等于当前记录DEPT_ID的记录。

  START WITH DEPT_ID = 2                -- 从部门2开始递归查询。

  ;

  DEPT_ID    PARENT_ID DEPT_NAME AMOUNT

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

  2                  1 1-2            15

  4                2 1-2-4          10

  5                2 1-2-5           9

  2、部门4及其所有上级部门

  SELECT LPAD(' ',2*(LEVEL - 1), ' ')||DEPT_ID AS DEPT_ID,

  PARENT_ID,DEPT_NAME,AMOUNT

  FROM T_DEPT_TEMP

  CONNECT BY PRIOR PARENT_ID = DEPT_ID -- 找出所有DEPT_ID等于当前记录PARENT_ID的记录

  START WITH DEPT_ID = 4               -- 从部门4开始递归查询。

  ;

  DEPT_ID    PARENT_ID DEPT_NAME AMOUNT

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

  4                  2 1-2-4          10

  2                1 1-2            15

  1                1               2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值