Backend/Oracle

[SQL] 계층형 쿼리

Deeb 2022. 1. 19. 15:29

계층형 쿼리(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 절에 서브쿼리(인라인뷰)를 사용해서 미리 조건에 맞는 형태의 행을 구성 

반응형