본문 바로가기
  • BLG-ZYNGIROK-모토-꿈꾸며-배우고-나누며-이루다
ICT/SQL

SQL 문법 | 데이터 조회 및 필터 | 재귀쿼리 RECURSIVE QUERY

by dazwischen 2021. 9. 26. 22:24
반응형

데이터 간의 계층 관계를 행과 열로 이루어진 표에서 직관적으로 표현하는 것은 쉬운일이 아니다. 그 어려운 일을 SQL은 재귀쿼리를 이용해서 시각화 해줄 수 있다. 단 계층을

재귀쿼리 RECURSIVE QUERY

recursive query thubnail image
SQL RECURSIVE QUERY

01 재귀쿼리란?

재귀쿼리의 이름을 먼저 살펴보도록 하자. 재귀라는 것은 영어로는 RECURSIVE, 즉 반복의 의미를 담고 있다. 재귀쿼리는 다시 말해서 반복적으로 작동될 쿼리라고 할 수 있고 '어떠한 쿼리를 반복적으로 실행한다' 라고 이해하면 좋다. 그렇다면 반복적인 작업이 왜 필요할까? 이유는 자료들의 계층을 파악하기 위해서이다. 데이터들은 각각 종속성과 피종속성을 갖지고 있다. 단순하지 않은 그런 속성을 한 번 데이터를 읽음으로서 완벽히 파악하기 어렵다. 따라서 그럴 때 재귀쿼리를 이용해 종속의 종속의 종속... 과 같이 반복되는 종속성을 파악해서 계급도나 가문도 같은 데이터의 계층 구조를 정확히 파악할 수 있다.

02 재귀쿼리 작성하는 방법 : WITH RECURSIVE

그렇다면 재귀쿼리는 어떻게 작성할까? 재귀쿼리는 임시 테이블을 불러올 때 사용했던 WITH에 RECURSIVE를 함께 작성하고 테이블들을 합칠 때 사용 했던 집합연산자 UNION 혹은 UNION ALL을 이용해서 다음과 같은 형식으로 작성한다.

WITH RECURSIVE TEMP_NAME (COL_1, COL_2,...) AS (
	NON_RECURSIVE_QUERY
    	UNION ALL
    	RECURSIVE_QUERY
  	)
SELECT 	COL1, COL2, TREATED_COL
FROM	TEMP_NAME
;

EXAMPLE

재귀쿼리를 이용해서 2부터 10까지의 리스트를 만들어주세요.

WITH RECURSIVE NUMBER (NO) AS (
	SELECT	2
    	FROM	NUMBER
    	UNION ALL
    	SELECT	N+1
    	FROM	NUMBER
    	WHERE	N+1 <= 10
)
SELECT	NO
FROM	NUMBER
;

 

위의 예시를 통해서 NON_RECURSIVE_QUERY 영역에서 시작 부분을 설정한다는 것을 알 수 있다. 만약 3부터 리스트를 만든다면 2대신 3을 작성하면 된다. 기본적인 QUERY를 이용해서 NON_RECURSIVE_QUERY를 작성한다면 시작 부분 조건을 WHERE절을 이용해서 설정할 수 있다.

EXAMPLE

담당 메니저를 기준으로 직장내 부서 위치도를 보여주세요.

WITH RECURSIVE TEMP_MEMBER AS (
	SELECT	M1.EMPLOYEE_ID, M1.MANAGER_ID, M1.DEPARTMENT_NAME, M1.NAME, 0 LVL
	FROM	MEMBER M1
    	WHERE	EMPLOYEE_ID = 1
    	UNION ALL
    	SELECT	M2.EMPLOYEE_ID, M2.MANAGER_ID, M2.DEPARTMENT_NAME, M2.NAME, M1.LVL + 1 
    	FROM	MEMBER M2, MEMBER M1
    	WHERE	M2.MANAGER_ID = M1.EMPLOYEE_ID
)
SELECT	EMPOLYEE_ID, MANAGER_ID, DEPARTMENT_NAME, LPAD(' ', 4 * (LVL)) || NAME AS NAME
FROM	TEMP_MEMBER
;

NON_RECURSIVE_QUERY 영역 WHERE절에서 EMPLOYEE_ID를 1로 설정하므로써 사원ID가 1인 사람을 시작으로 RECURSIVE_QUERY 영역이 작동하기 시작한다.

 

 

 

SUMMARY

  • RECURSIVE QUERY라고 불리는 재귀쿼리는 반복적인 작업을 할 때 사용된다.
  • 이런 반복적인 작업은 데이터 셋안의 계층 구조를 확인할 때 유용하게 사용할 수 있다.
  • 재귀 쿼리는 WITH RECURSIVE 로 시작하고 UNION 혹은 UNION ALL을 이용해서 NON RECURSIVE QUERY (비재귀쿼리)와 RECURSIRVE QUERY (재귀쿼리)를 합치는 쿼리를 갖는 형태를 갖고 있다.

* 오타 및 잘못된 내용이 있다면 댓글로 알려주세요!

반응형

댓글