계층형 쿼리(START WITH, CONNECT BY, ORDER SIBLINGS BY)
: 상위 타입과 하위 타입간의 관계를 계층식으로 표현할 수 있게 하는 질의어(SELECT)
👉START WITH : 상위 타입(부모)로 사용될 행을 지정 (서브쿼리 O)
START WITH PARENT_REPLY_NO IS NULL
PARENT_REPLY_NO만 봐도
부모인지 자식인지 알 수 있다 -> NULL로 구분
👉CONNECT BY : 상위 타입과 하위 타입간의 관계를 규정
PRIOR 연산자와 같이 사용하여 현재 행 이전에 상위타입이 있을지, 하위 타입이 있을지를 지정한다
( PRIOR 연산자 : 어떤 행 이전에 와야하는것을 규정한다)
SELECT * FROM REPLY
START WITH PARENT_REPLY_NO IS NULL
CONNECT BY PRIOR REPLY_NO = PARENT_REPLY_NO
ORDER SIBLINGS BY REPLY_NO;
CONNECT BY PRIOR 자식 컬럼 = 부모컬럼 (부모 -> 자식 계층 구조)
REPLY_NO = PARENT_REPLY_NO
-> 자식이 있기전에 부모가 있다 . 2번 번호를 가지고 있는 행의 부모번호가 1번이다
CONNECT BY PRIOR 부모 컬럼 = 자식 컬럼 ( 자식 -> 부모 계층 구조)
PARENT_REPLY_NO = REPLY_NO
-> 자식 위에있는 부모들
👉 ORDER SIBLINGS BY + 컬럼명 : 계층 구조를 쉽게 정렬
- INSERT 했을때 순서대로 넣어 예시에는 정렬된 것 같지만
DB의 삽입과정은 순차적이지 않기때문에 ORDER SIBLINGS BY가 필요
* 추가 기능 : LEVEL 가상 컬럼
-> START WITH로 지정된 행의 LEVEL을 1로 부여하고 하위 계층으로 내려갈수록 단계별 LEVEL을 1씩 증가시켜서 표현한다
-> 부모 : LEVEL 1, 자식 : LEVEL 2 , 손자 : LEVEL 3
=> 댓글과 대댓글 대대댓글의 모양을 만들때 LEVEL로 구분하여 사용하면 된다
[ 계층형 쿼리의 해석 순서 (주의하기!) ]
7. SELECT
1. FROM (+ JOIN)
2. START WITH
3. CONNECT BY
4. WHERE
5. GROUP BY
6. HAVING
8. ORDER BY
- WHERE절이 계층형 쿼리보다 늦게 해석되기 때문에
조건이 반영된 형태의 계층구조를 조회하고싶다면 FROM 절에 서브쿼리(인라인뷰)를 사용해서 미리 조건에 맞는 형태의 행을 구성
'Backend > Oracle' 카테고리의 다른 글
DB 정리 (0) | 2021.09.30 |
---|---|
[DB] TRIGGER (0) | 2021.09.30 |
[DB] PROCEDURE (0) | 2021.09.29 |
[DB] PL/SQL , (타입,레퍼런스)변수, 조건문, CASE문, 반복문, FOR , 예외처리 (0) | 2021.09.29 |
[DB] VIEW, SEQUENCE, INDEX (0) | 2021.09.29 |