1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
    [   계층형 쿼리    ]
    : 오라클 DBMS에서만 제공되는 강력한 기능이다.
    -> 계층적으로 출력되어야하는 경우에 굉장히 유용하다.
     
    ex)  스마트폰의 부품 구성도 정보가 저장되어 있는 테이블이 있다 하자
                스마트폰
                    |
    메인보드,  디스플레이,  배터리, 카메라
        |
CPU,  Memory
이런식으로 스마트폰아래에 메인보드, 디스플레이, 베터리, 카메라가 있고 메인보드 아래는 또 CPU, Memory가 있는 것처럼
계층형으로 데이터가 저장되어 있는 것이다.
 
데이터가 이런식으로 저장되어 있으려면 아래와 같이 보통 테이블에 저장되어 있을 것이다.
 
item_id, parent_id, product_name
100     null            스마트폰
101     100         메인보드
102     100         디스플레이
103     100         배터리
104     100         카메라
105     101         CPU
106     101         Memory
107     102         액정
 
이런식으로 parent_id에 부모에 해당하는 제품의 id를 할당해서 저장되어 있는데 이를 일반적으로는 계층형으로 출력할 수가 없다.
 
하지만, 오라클에서는 가능하다. start with, connect by 절을 이용한 계층형 쿼리를 이용해서!
 
start with (가장 상위의 root node의 조건) // 위의 예에서는 스마트폰은 parent_id가 null이다. -> 따라서, start with parent_id IS NULL로 표현할 수 있다.
connect by (계층을 이루는 조건) // -> connect by prior item_id = parent_id 이때, prior은 item_id의 부모값을 가지고 온다는 의미
-> 따라서 connect by parent_id = prior item_id 로 표현해도 된다.
 
*/
 
// ex) employees테이블은 사원의 employee_id(사번) 정보가 있고 상사의 사번이 manager_id에 저장되어 있다. 이를 이용해 계층형 쿼리를 출력해 보자.
select level, emp.employee_id, emp.first_name || emp.last_name 이름, jb.job_title 직책
from employees emp, jobs jb
where emp.job_id = jb.job_id
start with emp.parent_id IS NULL
connect by prior emp.employee_id = emp.parent_id

+ Recent posts