본문 바로가기
카테고리 없음

[sqld] 노랭이책(개정판) - 60번 문제(p.73)

by 플랜비BB 2024. 8. 22.

1. 예제 테이블

SELECT C1, C2, C3
FROM TAB1
START WITH C2 IS NULL
CONNECT BY PRIOR C1 = C2
ORDER SIBLINGS BY C3 DESC;

        C1         C2 C3
---------- ---------- ----------
         1            A
         3          1 C
         2          1 B
         4          2 D

예제쿼리.txt
0.00MB

 

 

2. 조회순서

A -> 1번
│
├── B -> 3번
│   │
│   ├── D -> 4번
│
└── C -> 2번
SELECT C1, C2, C3, LEVEL
FROM TAB1
START WITH C2 IS NULL
CONNECT BY PRIOR C1 = C2
ORDER SIBLINGS BY C3 DESC;

        C1         C2 C3              LEVEL
---------- ---------- ---------- ----------
         1            A                   1
         3          1 C                   2
         2          1 B                   2
         4          2 D                   3
 
// LEVEL: 계층 구조에서의 깊이를 나타냅니다. 루트 노드는 1부터 시작하며, 자식 노드로 갈수록 증가합니다.
// START WITH: 계층적 쿼리가 시작되는 루트 노드를 지정합니다.
// CONNECT BY PRIOR: 계층적 관계를 정의합니다. PRIOR 키워드를 사용하여 부모와 자식 간의 관계를 나타냅니다.
// ORDER SIBLINGS BY: 동일한 부모를 가진 형제 노드들 간의 순서를 제어합니다.
START WITH
1. C2 IS NULL인 행을 기준으로 시작 => A

PRIOR C1 = C2
2. A의 C1 = 1 / C2 = 1가 되는 행을 찾는다. B와 C가 있다.
	B와 C는 형제노드이고, DESC 정렬순으로 C를 먼저 찾는다. => C
3. C의 C1 = 3 / C2 = 3가 되는 행을 찾는다. => 없음
4. B와 C는 형제 노드이고, 남은 B를 조회한다. => B
5. B의 C1 = 2 / C2 = 2가 되는 행을 찾는다. => D
5. D의 C1 = 4 / C2 = 4가 되는 행을 찾는다. => 없음

 

[oracle] 계층형 쿼리 START WITH ~ CONNECT BY PRIOR