본문 바로가기
Language/MySQL

재귀 함수

by Mesut Özil 2024. 1. 4.

재귀 함수

RECURSIVE 키워드는 SQL에서 재귀적인 쿼리를 작성할 때 사용됩니다.

RECURSIVE 쿼리는 특정 데이터 구조의 계층 구조 탐색하거나,

자기 자신을 참조하는 데이터를 다룰 때 유용한 기능을 제공합니다.

예를 들어, 조직도나 카테고리 트리와 같은 계층 구조를 가진 데이터를 쿼리할 때 사용할 수 있습니다.


다음은 간단한 예시를 통해 RECURSIVE를 설명하겠습니다.

 

# organizations table
+----------------+----------------+------------------------+
| department_id  | department_name| parent_department_id   |
+----------------+----------------+------------------------+
|        1       |  Headquarters  |          NULL          |
|        2       |  Engineering   |           1            |
|        3       |   Marketing    |           1            |
|        4       |  Development   |           2            |
|        5       |    Testing     |           2            |
|        6       |     Sales      |           3            |
+----------------+----------------+------------------------+

WITH RECURSIVE OrganizationHierarchy AS (
    SELECT department_id, department_name, parent_department_id, 1 as level
    FROM organizations
    WHERE parent_department_id IS NULL

    UNION ALL

    SELECT o.department_id, o.department_name, o.parent_department_id, oh.level + 1
    FROM organizations o
    JOIN OrganizationHierarchy oh ON o.parent_department_id = oh.department_id
)
SELECT * FROM OrganizationHierarchy
ORDER BY department_id;

 

이 쿼리는 organizations 테이블에서 재귀적으로 부서-상위 부서 관계를 조회합니다.

OrganizationHierarchy라는 재귀적 CTE(Common Table Expression)를 정의합니다.
초기 단계에서는 상위 부서가 없는 부서를 선택하고,

WHERE parent_department_id IS NULL 조건을 통해 최상위 부서를 찾습니다.

UNION ALL을 사용하여 계속해서 부서-상위 부서 관계를 찾아내는 방식으로 쿼리가 구성됩니다.

 

# 결과
+----------------+----------------+------------------------+-------+
| department_id  | department_name| parent_department_id   | level |
+----------------+----------------+------------------------+-------+
|        1       |  Headquarters  |          NULL          |   1   |
|        2       |  Engineering   |           1            |   2   |
|        3       |   Marketing    |           1            |   2   |
|        4       |  Development   |           2            |   3   |
|        5       |    Testing     |           2            |   3   |
|        6       |     Sales      |           3            |   3   |
+----------------+----------------+------------------------+-------+

 

 

 

본 게시글은 ChatGPT의 도움을 받아 작성하였습니다.

'Language > MySQL' 카테고리의 다른 글

SQL 윈도우 함수  (0) 2024.01.06
CONCAT 함수  (0) 2024.01.05
DataBase (데이터베이스)  (2) 2024.01.03
REGEXP (정규 표현식)  (2) 2024.01.02
SQL 집합 연산자  (0) 2023.12.29