[Basic] 계층적 질의문

고보·2024년 1월 23일

1 계층적 질의문 개념

  • 간단한 계층적 구조.
    학과의 상위가 학부, 그 상위는 공대다. 정보미디어학부 아래에 컴퓨터공학과가 있고, 그래서 컴퓨터공학과의 college 100은 정보미디어학부의 deptno이다.
  • 꼭대기가 Root, 가장 바닥이 leaf.

2 출력하기

(top down. deptno가 자식, college가 부모 관계)
SELECT [LEVEL], deptno, dname, college
FROM department
START WITH deptno = 10
CONNECT BY [NOCYCLE] PRIOR deptno = college;

(bottom up. college가 부모, deptno가 자식 관계)
SELECT [LEVEL], deptno, dname, college
FROM department
START WITH deptno = 101
CONNECT BY [NOCYCLE] PRIOR college = deptno;
  • LEVEL은 계층별로 레벨 번호(depth)가 표시된다. 루트는 1, 하위로 갈수록 1씩 증가한다.
  • START WITH은 출력의 시작점. top down 이면 시작하려는 상위, bottom up이면 시작하려는 하위. subquery 사용 가능하다.
  • CONNECT BY PRIOR 여기서 계층 관계의 데이터 지정한다.
    • 현재 노드의 자식 = 다음 노드의 부모 로 지정하면 top down. 현재 노드의 자식과 다음 노드의 부모가 같은 번호이므로 아래로 내려간다.
    • 현재 노드의 부모 = 다음 노드의 자식 으로 지정하면 bottom up.
  • NOCYCLE은 무한 루프를 방지한다.
  • 실행순서
    • START WITH => CONNECT BY => WHERE

2-1 응용 출력1 - 시각적 표시

SELECT LEVEL, LPAD(dname, (LEVEL-1)*4, '-') 조직도
FROM department
START WITH dname = '공과대학'
CONNECT BY PRIOR deptno = college;

혹은
LPAD(' ', (LEVEL-1)*2)||dname 조직도
  • 이런 식으로 하면 LEVEL이 클수록(depth가 깊을수록) 왼쪽에 들여쓰기가 된다. 1인 시작은 들여쓰기가 0

2-2 응용 출력2 - CONNECT_BY_ROOT

SELECT LPAD(ename, (LEVEL-1)*4, ' ') 사원명, empno 사번, 
	CONNECT_BY_ROOT empno 최상위사번, LEVEL
FROM emp
START WITH job = UPPER('president')
CONNECT BY PRIOR empno = mgr;
  • CONNECT_BY_ROOT 는 해당 행의 ROOT를 표시

2-3 응용 출력3 - CONNECT_BY_ISLEAF

SELECT LPAD(ename, (LEVEL-1)*4, ' ') 사원명, empno 사번, 
	CONNECT_BY_ISLEAF Leav_TF, LEVEL
FROM emp
START WITH job = UPPER('president')
CONNECT BY PRIOR empno = mgr;
  • CONNECT_BY_ISLEAF는 단말 노드(leaf node)인지. 1이면 단말, 0이면 그렇지 않다.
SELECT LPAD(ename, (LEVEL-1)*4, ' ') 사원명, empno 사번, LEVEL
FROM emp
WHERE CONNECT_BY_ISLEAF = 1
START WITH job = UPPER('president')
CONNECT BY PRIOR empno = mgr;
  • 이런 식으로 이용하면 leaf node만 출력 가능

2-4 응용 출력4 - ORDER SIBLINGS BY

SELECT LPAD(ename, (LEVEL-1)*4, ' ') 사원명, empno 사번, LEVEL
FROM emp
START WITH job = UPPER('president')
CONNECT BY PRIOR empno = mgr
ORDER BY SIBLINGS BY ename;
  • 계층적 구조에서 일반적인 order by로 마무리를 해버리면, 계층 구조를 무시한 채 order by 순서대로 출력된다.
    but ORDER BY SIBLINGS BY로 기준을 설정하면, 계층을 지키는 범위에서 그 기준대로 출력한다.

2-5 응용 출력5 - SYS_CONNECT_BY_PATH

SELECT LPAD(ename, (LEVEL-1)*4, ' ') 사원명, empno 사번, 
	SYS_CONNECT_BY_PATH(ename, '/') path
FROM emp
START WITH job = UPPER('president')
CONNECT BY PRIOR empno = mgr;
  • 계층의 path를 '/'로 구분하며 표시한다. /KING/JONES/SCOTT 이렇게.
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글