오라클에서 계층형 쿼리를 짜야할 때 사용하기 좋은 문법은 Connect By가 있다
상위 계층을 정하고 아래의 연결 된 계층을 연결 시켜줘서 굉장히 편하게 사용 가능하다
[ 참고 블로그 ]
[Oracle] 계층형 쿼리 쉬운 정리(START WITH CONNECT BY)
오라클 사용 시 계층형 쿼리를 종종 사용하게 된다. LEVEL 어쩌구 CONNECT BY 어쩌구.. 처음 마주하면 굉장히 복잡하고 어려워보인다..... 몰라서 검색해봐도 무슨 말인지 이해하기 어려운 설명들이
grandma-coding.tistory.com
1. 계층형이 필요한 이유 ?
흔히 계층형이라하면 연결 된 형태의 데이터를 의미한다
부모 - 자식 관계라고 이해하면 편한데
A1
A2 A3 A4
A5A6 A7A8 A9A10
위 형태의 데이터를 보면 이해하기 편하다
A1을 상위 데이터로 두는 A2,3,4
A2를상위로보는 A5,A6
A3를상위로보는 A7,A8
A4를상위로보는 A9,A10
위와같은 데이터를 순서대로 본다면, 재정렬 필요없이
어떤 데이터가 상위 계츠인지 알 수 있기에 데이터를 편하게 관리할 수 있다
2. CONNET BY
CONNECT BY를 사용하면 간단하게 위와 같은 계층형 쿼리를 작성할 수 있다
WITH TB_BOARD AS (
SELECT 1 AS NUMBER_ID, NULL AS UP_ID, 'A1' AS TITLE FROM DUAL
UNION ALL
SELECT 2 AS NUMBER_ID, 1 AS UP_ID, 'A2' AS TITLE FROM DUAL
UNION ALL
SELECT 3 AS NUMBER_ID, 1 AS UP_ID, 'A3' AS TITLE FROM DUAL
UNION ALL
SELECT 4 AS NUMBER_ID, 1 AS UP_ID,'A4' AS TITLE FROM DUAL
UNION ALL
SELECT 5 AS NUMBER_ID, 2 AS UP_ID,'A5' AS TITLE FROM DUAL
UNION ALL
SELECT 6 AS NUMBER_ID, 2 AS UP_ID,'A6' AS TITLE FROM DUAL
UNION ALL
SELECT 7 AS NUMBER_ID, 3 AS UP_ID,'A7' AS TITLE FROM DUAL
UNION ALL
SELECT 8 AS NUMBER_ID, 3 AS UP_ID,'A8' AS TITLE FROM DUAL
UNION ALL
SELECT 9 AS NUMBER_ID, 4 AS UP_ID,'A9' AS TITLE FROM DUAL
UNION ALL
SELECT 10 AS NUMBER_ID, 4 AS UP_ID,'A10' AS TITLE FROM DUAL
UNION ALL
SELECT 11 AS NUMBER_ID, 5 AS UP_ID,'A11' AS TITLE FROM DUAL
UNION ALL
SELECT 12 AS NUMBER_ID, 13 AS UP_ID,'A12' AS TITLE FROM DUAL
) SELECT * FROM TB_BOARD
START WITH UP_ID IS NULL
CONNECT BY PRIOR NUMBER_ID = UP_ID;
위 쿼리의 결과는
위와 같다
문법적인 부분을 보자
(1) START WITH
START WITH는 쿼리의 최상위 계층을 정하는 구문이다
현재 내 쿼리에서는 IS NULL을 사용하여 NULL인 컬럼을 최상위 계층으로 두고자 하였다
(2) CONNECT BY PRIOR
connect by 직속상사 = prior 직원
CONNECT BY PRIOR 구문의 순서를 잘못적으면 역순이 되어서 쿼리 조회가 제대로 이뤄지지않을수 있다
CONNECT BY PRIOR ID = UP_ID 규칙을 지키면 크게 문제없이 사용가능하지만
상황에 맞게 조건을 잘 걸면 좋을 것 같다