계층형 쿼리는 데이터의 계층 관계를 분석하는 데 사용되며, SQLD 시험에서는 부모-자식 관계를 정확히 파악하는 것이 핵심입니다. 부모-자식 관계를 판별하는 방법은 크게 PRIOR 위치, 중복 여부, LEVEL 함수를 통해 확인할 수 있습니다.
START WITH: 쿼리 실행의 시작점을 지정합니다. (루트 노드)CONNECT BY PRIOR: 부모-자식 관계를 정의합니다.PRIOR: PRIOR가 붙은 쪽이 부모를 의미합니다.CONNECT BY PRIOR empno = mgr: empno가 부모, mgr이 자식 (순방향)CONNECT BY empno = PRIOR mgr: empno가 자식, mgr이 부모 (역방향)LEVEL: 현재 노드의 계층 깊이를 나타냅니다.SYS_CONNECT_BY_PATH: 루트부터 현재 노드까지의 경로를 문자열로 반환합니다.LEVEL 함수로 판별LEVEL은 계층의 깊이를 나타냅니다.LEVEL은 항상 1입니다.SYS_CONNECT_BY_PATH로 판별CEO->부장->과장 경로에서 CEO는 부장의 부모, 부장은 과장의 부모입니다.PRIOR의 위치: PRIOR가 부모 컬럼에 붙는다는 원칙만 기억하면 순방향/역방향 문제가 쉽게 해결됩니다.LEVEL의 시작: LEVEL은 1부터 시작하며, LEVEL = 0은 존재하지 않습니다.ORDER SIBLINGS BY: ORDER BY가 아닌 ORDER SIBLINGS BY를 사용해야 계층 구조를 유지하면서 형제 노드끼리 정렬됩니다.1. 다음 쿼리의 실행 결과에 대한 설명으로 옳은 것은?
SELECT empno, ename, LEVEL
FROM emp
START WITH ename = 'SMITH'
CONNECT BY ename = PRIOR mgr;
A. 'SMITH'를 시작으로 부하직원을 찾아 내려간다.
B. 'SMITH'를 시작으로 상위 관리자를 찾아 올라간다.
C. 'SMITH'와 동일한 직급의 사원을 찾아 내려간다.
D. 'SMITH'의 부모만 출력한다.
2. 다음 중 부모 노드를 의미하는 컬럼의 특징은?
A. LEVEL 값이 항상 1이다.
B. 결과 집합에서 중복되어 나타난다.
C. SYS_CONNECT_BY_PATH의 결과가 가장 짧다.
D. CONNECT BY에서 PRIOR가 붙지 않는 컬럼이다.
3. “계층형 쿼리의 루트 노드는 반드시 부모 노드이다.”라는 지문에 대한 판단으로 옳은 것은?
A. 옳다. 루트 노드는 항상 부모 노드 역할을 한다.
B. 옳지 않다. 자식이 없는 루트 노드는 부모 노드라고 할 수 없다.
C. 옳다. LEVEL = 1인 모든 노드는 부모 노드이다.
D. 옳지 않다. LEVEL은 부모 여부와 관계가 없다.
CONNECT BY ename = PRIOR mgr에서 PRIOR가 mgr(부모)에 붙었으므로 역방향 탐색입니다. 'SMITH'를 시작점으로 상위 관리자를 찾아 올라갑니다.LEVEL이 1인 루트 노드라도, 만약 자식 노드가 없다면 부모 노드로 볼 수 없습니다. 따라서 지문은 틀렸습니다.