ORACLE遞歸查詢遍歷詳解

Oracle 實在太強了,本篇文章詳細介紹了Oracle的遞歸查詢語法,利用此語法,能夠方便地實現遞歸的雙向查詢: 測試

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

  -- Author       : Rake Gaoorm

  -- Create Date : 2005-08-22遞歸

  -- Version      : 2.0it

  -- Last Modify : 2005-08-22io

  目 錄table

  1、測試準備ast

  2、實現各類查詢要求form

  3、要點總結select

  正 文

  1、測試準備

  一、先假設有以下部門結構。

  1

  / /

  2    3

  //    /|/

  4 5 6 7 8

  二、而後創建測試表和數據。

  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

  三、調整一下輸出格式

  col DEPT_ID format A10;

  2、接下來實現各類查詢要求

  一、部門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

  二、部門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

相關文章
相關標籤/搜索