1. 오라클에서만 가능한 계층형쿼리 (start with ~ connect by구문)
-- p.46
SELECT
D.DEPT_NO
, LPAD ('☆', 2 * LEVEL - 2, '★') || D.DEPT_NM AS DEPT_NM
, D.UP_DEPT_NO
, LEVEL LV
FROM CF08 D
START WITH D.UP_DEPT_NO IS NULL -- 최상위 데이터에 대한 조건
CONNECT BY D.UP_DEPT_NO = **PRIOR D**.DEPT_NO -- 데이터를 어떻게 연결시킬지를 정하는 조건
ORDER SIBLINGS BY D.DEPT_NO -- 정렬시 계층에 따라 하위 노드가 있으면 하위 노드를 표현
| DEPT_NO | DEPT_NM | UP_DEPT_NO | LV |
| ------- | ---------- | ---------- | ---- |
| 10 | 대표이사 | | 1 |
| 11 | ★☆사업본부 | 10 | 2 |
| 13 | ★★★☆상품팀 | 11 | 3 |
| 15 | ★★★☆영업팀 | 11 | 3 |
| 12 | ★☆지원본부 | 10 | 2 |
| 14 | ★★★☆물류팀 | 12 | 3 |
| 16 | ★★★☆재무팀 | 12 | 3 |
CONNECT BY 현재테이블.상위부서번호 = **부모테이블**.부서번호 -- 왼쪽은 하단레코드, 우측은 상단레코드
2. 모든 DBMS에서 가능한 쿼리 (with~as구문)
- 오라클의
start with ~ connect by 보다 세밀한 제어를 할 수 있다
- 가독성이 더 좋다
-- p.47
WITH DEPTS (DEPT_NO,DEPT_NM,UP_DEPT_NO,LV) AS (
SELECT
D.DEPT_NO
, D.DEPT_NM
, D.UP_DEPT_NO
, 1 LV
FROM CF08 D
WHERE D.UP_DEPT_NO IS NULL -- START WITH
UNION ALL
SELECT
D.DEPT_NO
, D.DEPT_NM
, D.UP_DEPT_NO
, DS.LV + 1
FROM CF08 D
, DEPTS DS
WHERE 1 = 1
AND D.UP_DEPT_NO = DS.DEPT_NO -- CONNECT BY
)
SEARCH DEPTH FIRST BY DEPT_NO SET DEPT_SEQ -- ORDER SIBLINGS BY
SELECT
DEPT_NO
, LPAD(' ', 2 * LV - 2, ' ') || DEPT_NM AS DEPT_NM
, UP_DEPT_NO
, LV
FROM DEPTS
ORDER BY DEPT_SEQ