oracle 删除用户 递归,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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值