sql 계층 화 조회(START BY...CONNECT BY PRIOR)

9993 단어 startbyconnectprior
문장http://blog.csdn.net/leshami/article/details/5616877
 
--======================================================
--SQL 기반-->계층 화 조회(START BY...CONNECT BY PRIOR)
--======================================================
 
계층 화 조회,즉 트 리 구조 조회 로 SQL 에서 자주 사용 하 는 기능 중 하나 로 보통 뿌리 노드,부모 노드,서브 노드,잎 노드 로 구성 되 는데 그 문법 은 다음 과 같다.
      
SELECT [LEVEL] ,column,expression,...
       FROM table_name
       [WHERE where_clause]
       [[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];
      
       LEVEL:   ,        
       start_condition:          
       prior_condition:              
   
    --  start with ...connect by prior         
    SQL> select empno,mgr,ename,job from emp
      2  start with empno = 7839
      3  connect by prior empno = mgr;
 
        EMPNO        MGR ENAME      JOB
    ---------- ---------- ---------- ---------
         7839            KING       PRESIDENT
         7566       7839 JONES      MANAGER
         7788       7566 SCOTT      ANALYST
         7876       7788 ADAMS      CLERK
         7902       7566 FORD       ANALYST
         7369       7902 SMITH      CLERK
         7698       7839 BLAKE      MANAGER
         7499       7698 ALLEN      SALESMAN
         7521       7698 WARD       SALESMAN
         7654       7698 MARTIN     SALESMAN
         7844       7698 TURNER     SALESMAN
 
        EMPNO        MGR ENAME      JOB
    ---------- ---------- ---------- ---------
         7900       7698 JAMES      CLERK
         7782       7839 CLARK      MANAGER
         7934       7782 MILLER     CLERK

 
    트 리 구조 옮 겨 다 니 는 과정(위의 조 회 를 통 해 설명)
       1).뿌리 노드 부터(즉 whereclause 의 조건,비 근 노드 라면 뿌리 노드 를 뿌리 노드 로 나 누 어 옮 겨 다 니 기 시작 합 니 다.예 를 들 어 empno=7839)
       2).루트 노드 를 옮 겨 다 니 기(empno=7839 기록 에 관 한 정보 얻 기)
       3).이 노드 에 하위 노드 가 존재 하 는 지 판단 하고 맨 왼쪽 에 접근 하지 않 은 하위 노드 를 방문 하여 이동 합 니 다).그렇지 않 으 면 다음 단계 입 니 다.
           상례 와 같이 priorcondition 은 empno=mgr,즉 하위 노드 의 mgr 는 부모 노드 의 empno 와 같 습 니 다.이때 mgr 는 7839 의 기록 입 니 다.
       4).노드 가 잎 노드 일 때 접근 이 완료 되 고 그렇지 않 으 면 이동)
       5).이 노드 의 부모 노드 로 되 돌아 가 며 이동)
      
--위 열 level 사용
--connect by prior empno=mgr 의 이해 에 주의
--prior 는 이전 기록,즉 다음 기록 을 되 돌려 주 는 mgr 는 이전 기록 의 empno 와 같 아야 함 을 나타 낸다.
SQL> select level,empno,mgr,ename,job from emp
      2  start with ename = 'KING'
      3  connect by prior empno = mgr
      4  order by level;
 
        LEVEL      EMPNO        MGR ENAME      JOB
    ---------- ---------- ---------- ---------- ---------
            1       7839            KING       PRESIDENT
            2       7566       7839 JONES      MANAGER
            2       7698       7839 BLAKE      MANAGER
            2       7782       7839 CLARK      MANAGER
            3       7902       7566 FORD       ANALYST
            3       7521       7698 WARD       SALESMAN
            3       7900       7698 JAMES      CLERK
            3       7934       7782 MILLER     CLERK
            3       7499       7698 ALLEN      SALESMAN
            3       7788       7566 SCOTT      ANALYST
            3       7654       7698 MARTIN     SALESMAN
 
        LEVEL      EMPNO        MGR ENAME      JOB
    ---------- ---------- ---------- ---------- ---------
            3       7844       7698 TURNER     SALESMAN
            4       7876       7788 ADAMS      CLERK
            4       7369       7902 SMITH      CLERK
   
    --     
    SQL> select count(distinct level) "Level" from emp
      2  start with ename = 'KING'
      3  connect by prior empno = mgr;
 
        Level
    ----------
            4 
            
    --         (     * level - 1   )
    SQL> col Ename for a30
    SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename",
      3    job
      4  from emp
      5  start with ename = 'KING'
      6  connect by prior empno = mgr;
 
        LEVEL Ename                          JOB
    ---------- ------------------------------ ---------
            1  KING                          PRESIDENT
            2    JONES                       MANAGER
            3      SCOTT                     ANALYST
            4        ADAMS                   CLERK
            3      FORD                      ANALYST
            4        SMITH                   CLERK
            2    BLAKE                       MANAGER
            3      ALLEN                     SALESMAN
            3      WARD                      SALESMAN
            3      MARTIN                    SALESMAN
            3      TURNER                    SALESMAN
 
        LEVEL Ename                          JOB
    ---------- ------------------------------ ---------
            3      JAMES                     CLERK
            2    CLARK                       MANAGER
            3      MILLER                    CLERK
--         (    start with       )
    SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename",
      3    job
      4  from emp
      5  start with ename = 'SCOTT'
      6  connect by prior empno = mgr;
 
        LEVEL Ename                          JOB
    ---------- ------------------------------ ---------
            1  SCOTT                         ANALYST
            2    ADAMS                       CLERK

--아래 에서 위로 옮 겨 다 니 기(connect by prior 의 조건 을 교환 하면 되 며 mgr=empno 를 사용)
--connect by prior mgr=empno 의 이해 에 주의 하 십시오--prior 는 이전 기록,즉 다음 기록 을 되 돌려 주 는 empno 는 이전 기록 의 mgr 와 같 아야 합 니 다.
SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename",
      3    job
      4  from emp
      5  start with ename = 'SCOTT'
      6  connect by prior mgr = empno;
 
        LEVEL Ename                          JOB
    ---------- ------------------------------ ---------
            1  SCOTT                         ANALYST
            2    JONES                       MANAGER
            3      KING                      PRESIDENT
            
    --      (    prior      ,       )
    SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename",
      3    job
      4  from emp
      5  start with ename = 'SCOTT'
      6  connect by empno = prior mgr;
 
        LEVEL Ename                          JOB
    ---------- ------------------------------ ---------
            1  SCOTT                         ANALYST
            2    JONES                       MANAGER
            3      KING                      PRESIDENT
            
    --             
    SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename"
      3    ,job
      4  from emp
      5  where ename != 'SCOTT'    --  where     SCOTT  , SCOTT   ADAMS      
      6  start with empno = 7839   
      7  connect by prior empno = mgr;
 
        LEVEL Ename                JOB
    ---------- -------------------- ---------
            1  KING                PRESIDENT
            2    JONES             MANAGER
            4        ADAMS         CLERK
            3      FORD            ANALYST
            4        SMITH         CLERK
            2    BLAKE             MANAGER
            3      ALLEN           SALESMAN
            3      WARD            SALESMAN
            3      MARTIN          SALESMAN
            3      TURNER          SALESMAN
            3      JAMES           CLERK
 
        LEVEL Ename                JOB
    ---------- -------------------- ---------
            2    CLARK             MANAGER
            3      MILLER          CLERK

--필터 조건 을 where 자구 의 내용 에서 connect by prior 자구 로 이동 시 켜 SCOTT 및 그 부 하 를 걸 러 낸다
SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename"
      3    ,job
      4  from emp
      5  start with empno = 7839
      6  connect by prior empno = mgr and ename != 'SCOTT';
 
        LEVEL Ename                JOB
    ---------- -------------------- ---------
            1  KING                PRESIDENT
            2    JONES             MANAGER
            3      FORD            ANALYST
            4        SMITH         CLERK
            2    BLAKE             MANAGER
            3      ALLEN           SALESMAN
            3      WARD            SALESMAN
            3      MARTIN          SALESMAN
            3      TURNER          SALESMAN
            3      JAMES           CLERK
            2    CLARK             MANAGER
 
        LEVEL Ename                JOB
    ---------- -------------------- ---------
            3      MILLER          CLERK

--계층 적 조회 에 필터 조건 을 추가 하거나 하위 조 회 를 사용 하 는 경우
SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename"
      3    ,job
      4  from emp
      5  where sal > 2500
      6  start with empno = 7839
      7  connect by prior empno = mgr                     
      8  ;
 
        LEVEL Ename                JOB
    ---------- -------------------- ---------
            1  KING                PRESIDENT
            2    JONES             MANAGER
            3      SCOTT           ANALYST
            3      FORD            ANALYST
            2    BLAKE             MANAGER
            
    SQL> select level,
      2    lpad(' ',2 * level - 1) || ename as "Ename"
      3    ,job
      4  from emp
      5  where sal > (select avg(sal) from emp)
      6  start with empno = 7839
      7  connect by prior empno = mgr ;
 
        LEVEL Ename                JOB
    ---------- -------------------- ---------
            1  KING                PRESIDENT
            2    JONES             MANAGER
            3      SCOTT           ANALYST
            3      FORD            ANALYST
            2    BLAKE             MANAGER
            2    CLARK             MANAGER

좋은 웹페이지 즐겨찾기