본문 바로가기
IT/Database

[Oracle] 계층형 쿼리 사용법

by 성준하이 2023. 2. 22.
반응형

계층형 쿼리라고 오라클에서 존재하는 문법이 있다.

테이블 내에서 예를들어

a b
대한민국 서울
서울 송파구
서울 강남구
송파구 방이동
송파구 문정동

이와 같이 a는 무조건 상위 개념이고 b는 무조건 하위개념인것처럼 이런 계층형을 만들수 있는 쿼리이다.

 

지금 처럼 주소 관련이나 상사, 하사 같은 개념을 표기할때 유용하게 쓰이곤 한다.

 

사용법 이전에 각 문법에 대한 개념 설명은 다음과 같다.

 

  • 계층형 쿼리 : 부모, 자식 간의 수직관계를 트리 구조 형태로 보여주는 쿼리
  • START WITH : 트리 구조의 최상위 행을 지정
  • CONNECT BY : 부모, 자식의 관계를 지정
  • PRIOR : CONNECT BY 절에 사용되며 PRIOR에 지정된 컬럼이 맞은편 컬럼을 찾기
  • CONNECT BY PRIOR 자식 컬럼 = 부모 컬럼 : 부모 → 자식 순방향 전개
  • CONNECT BY PRIOR 부모 컬럼 = 자식 컬럼 : 자식 → 부모 역방향 전개
  • ORDER SIBLINGS : 계층형 쿼리에서 정렬을 수행

이 개념을 기반으로 간단한 예제는 아래와 같다.

 

데이터 생성

create table table1 ( col1 varchar2(1), col2 varchar2(1));

insert into table1 values('a','b');

insert into table1 values('b','c');

insert into table1 values('a','c');

insert into table1 values('c','d');

insert into table1 values('c','e');

insert into table1 values('e','f');

commit;

 

조회

col1  col2

----------

   a      b

   b      c

   a      c

   c      d

   c      e

   e      f

 

그럼 이제 이 데이터를 계층형 쿼리로 출력을 해볼것이다.

 

부모 -> 자식 순방향 전개 계층형 쿼리

select col1, col2, level from table1 start with col1 = 'a' connect by prior col2 = col1;

 

위에 설명 했듯이 순방향 전개는 마지막 connect by 에서 나뉜다.

그럼 결과는 다음과 같다.

col1   col2   LEVEL

------------------

   a       b          1 <- 첫번째 부모행을 시작으로 자식 탐색

   b       c          2

   c       d          3

   c       e          3

   e       f           4 <- 첫번째 부모행의 자식 탐색 종료

   a       c           1 <- 두번째 부모행의 자식 탐색 시작

   c       d           2

   c       e           2

   e       f            3 <- 두번째 부모행의 자식 탐색 종료

 

실행 결과는 level 1에는 최상위 레벨을 두고 자식이 없을때까지 계속 타고 들어갔다가 마지막까지 탐색 후 두번째 최상위 부모를 탐색한다.

 

그리고 추가적으로 

order siblings 를 사용하게 되면 

이전 쿼리에 마지막에 

order siblings by col2 desc;

를 추가 한다면 정렬이 이루어지게 된다.

 

col1   col2   LEVEL

------------------

   a       c          1 <- LEVEL 1 중에서 col2 desc 정렬했을 때 c가 가장 맨위에 옴

   c       e          2 <- LEVEL 2 중에서(위 LEVEL 1의 자식 기준) col2 desc 정렬했을 때 e가 가장 맨위에 옴

   e       f          3

   c       d          2

   a       b           1 <- LEVEL 1 중에서 child_c desc 정렬했을 때 두번째인 b가 옴

   b       c           2 

   c       e           3

   e       f           4

   c       d            3 

 

이런식으로 이루어진다.

 

역방향 전개를 한다면 connect by 절에서 순서를 바뀌어서 정렬을 하면 가능하다.

반응형

'IT > Database' 카테고리의 다른 글

프로시저 / 함수 선언법  (21) 2023.03.31
H2 Database 란? (in Spring)  (68) 2023.03.05
[Oracle] ORA-00001: unique constraint () violated ERROR  (10) 2023.02.17
[Oracle] EXISTS, NOT EXISTS  (8) 2023.02.08
NVL함수  (9) 2023.01.15

댓글