본문 바로가기

   
Programming/ORACLE

9일차!

반응형

 계층형 쿼리.

 잘못만들면 무한 루프를 돌수도 있음. 주의.
 

계층 구조를 가진 데이터
     ㄴ 조직도, 카테고리

 조직도가 보통의 모습.

오라클의 계층형 쿼리.
     Start with     - 계층형 데이터를 조회할 때 시작 행(위치)를 지정함.

     Connect by     - 부모행과 자식행의 관계를 지정함.
                    - prior 연산자를 사용해서 연결방향 지정 가능.
                    connect by prior 부모키 = 자식키 <-- top-down  방식, 위 아래.
                    connect by prior 자식키 = 부모키 <-- bottom-up 방식, 아래 위.                   

                    connect by prior 자식컬럼 = 부모컬럼
                    CONNECT BY PRIOR employee_id = manager_id 

                                       ^
                                요자리가 먼저나옴.

     level          - 계층구조의 depth를 표현.
          
          connect by isleaf
                    - 자식행이 없으면 1을 반환
          order siblings by
                    - 계층형 데이터를 트리구조로 유지하면서, 정렬할때 사용한다.


 

SELECT DCODE as ah, DNAME, PDEPT as bumo, LEVEL

FROM DEPT2

  START WITH DCODE = '0001'

    CONNECT BY PRIOR DCODE = PDEPt and LEVEL <= 2;


    




 

SELECT lpad('  ', level *3, '-') || DCODE as ah, DNAME, PDEPT as bumo, LEVEL

FROM DEPT2

  START WITH DCODE = '0001'

    CONNECT BY PRIOR DCODE = PDEPT;




이걸 응용하면...




-- 원래는 이럼.

sELECT lpad(' ', (LEVEL-1)*3, ' ') || LAST_NAME,

       employee_id,

       MANAGER_ID,

       LEVEL

FROM EMPLOYEES

START WITH employee_id = 101

      CONNECT BY PRIOR employee_id = manager_id;










-- 얘 하나만 빼기.

SELECT lpad(' ', (LEVEL-1)*3, ' ') || LAST_NAME,

       employee_id,

       MANAGER_ID,

       LEVEL

FROM EMPLOYEES

WHERE LAST_NAME != 'Greenberg'

START WITH employee_id = 101

      CONNECT BY PRIOR employee_id = manager_id;










-- 가지치기.


SELECT lpad(' ', (LEVEL-1)*3, ' ') || LAST_NAME,

       employee_id,

       MANAGER_ID,

       LEVEL

FROM EMPLOYEES

START WITH employee_id = 101

      CONNECT BY PRIOR employee_id = manager_id and LAST_NAME != 'Greenberg';





1이면 아래가 없음 잎사귀
0이면 아래가 있음 나뭇가지
가지와 나무.




반응형