본문 바로가기
분석/데이터분석

Recursive Query (재귀쿼리)

by 여우요원 2024. 3. 12.

아래의 쿼리는 mysql 8.x 버젼대에서 실행한 내용입니다. (recursive 쿼리를 지원하는)

 

1. 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE division
(
    division_code character varying(20NOT NULL PRIMARY KEY,
    division_name character varying(20NOT NULL,
    upper_division_code character varying(20NOT NULL
);
 
INSERT INTO division VALUES ('develop_division''개발본부''');
INSERT INTO division VALUES ('front_team''프론트팀''develop_division');
INSERT INTO division VALUES ('infra_team''인프라팀''develop_division');
INSERT INTO division VALUES ('back_team''백엔드팀''develop_division');
INSERT INTO division VALUES ('web_part''웹파트''front_team');
INSERT INTO division VALUES ('aos_part''AOS파트''front_team');
INSERT INTO division VALUES ('ios_part''IOS파트''front_team');
INSERT INTO division VALUES ('1_part''1파트''back_team');
INSERT INTO division VALUES ('2_part''2파트''back_team');
cs

 

위 코드를 실행하면 sample 데이터를 생성할 수 있으며, 그 데이터는 아래의 구조를 나타낸 데이터입니다.

데이터 구조

 

2. 하향탐색 재귀쿼리 (기준 node 에서 아래 방향으로 탐색)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 하향 탐색 
 
with recursive find_division
as (
-- start
select division_code, division_name, upper_division_code, 1 as depth
from division 
where 1=1 
    and division_code = 'develop_division'
union all
-- repeat
select d.division_code, d.division_name, d.upper_division_code, fd.depth + 1 
from find_division fd 
join division d on d.upper_division_code = fd.division_code
)
select *
from find_division
cs

 

  • -- start 부분에서는 하향검색을 시작할 노드를 설정하는 부분이다.
  • -- repeat 부분에서는 위에서 설정한 초기 값이 재쿼리의 타이틀인 find_division 에 들어가고
    그 값을 기준으로 다시 division 을 조인한다.
  • division 테이블이 하위 코드를 탐색하게 되는 테이블이라 d.upper_division_code 를 fd.division_code 로 연결한다.

결과는 아래와 같다.

 

3. 상향탐색 재귀쿼리 (기준 node 에서 위 방향으로 탐색)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 상향 탐색 
 
with recursive find_division
as (
-- start
select division_code, division_name, upper_division_code, 1 as depth
from division 
where 1=1 
    and division_code = 'web_part'
union all
-- repeat
select d.division_code, d.division_name, d.upper_division_code, fd.depth + 1 
from find_division fd 
join division d on d.division_code = fd.upper_division_code
)
select *
from find_division
cs

 

  • -- start 부분에서는 상향검색을 시작할 노드를 설정하는 부분이다.
  • -- repeat 부분에서는 위에서 설정한 초기 값이 재쿼리의 타이틀인 find_division 에 들어가고
    그 값을 기준으로 다시 division 을 조인한다.
  • division 테이블이 상위 코드를 탐색하게 되는 테이블이라 d.division_code 를 fd.upper_division_code 로 연결한다.

결과는 아래와 같다.