알고리즘

재귀함수 - 리커시브 쿼리 Recursive Function

Hyeongjun_Ham 2024. 1. 3. 15:31

재귀함수 - 리커시브 쿼리 Recursive Function

 

이번에 계층구조를 처리할 일이 생겨 리커시브 쿼리에 대해서 학습하게 되었다.

 

리커시브 쿼리란 말 그대로 특정 쿼리를 반복적으로 실행하는 것이다.

 

먼저 어떻게 사용하는지 쿼리문부터 확인해 보자

 

WITH [RECURSIVE] TABLE명 AS (
    SELECT - # 비반복문. 무조건 필수
    [UNION ALL] # RECURSIVE 사용 시 필수. 다음에 이어붙어야 할 때 사용
    SELECT - 
    [WHERE -] # RECURSIVE 사용 시 필수. 정지 조건 필요할 때 사용
)

 

WITH 구문은 메모리 상에 가상 테이블을 저장할 때 사용한다.

 

저렇게 메모리에 올려두고 사용하고 싶을 때 사용할 수 있다.

 

사용 예시는 다음과 같다.

 

WITH RECURSIVE cte_count 
AS ( 
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 AS num 
    FROM cte_count
    WHERE n < 10
)

SELECT * FROM  cte_count ;

 

결과

 

n이 1부터 시작해서 10까지 가서 실행된 것을 볼 수 있다.

 

함수로도 구현하고 싶으면 방법은 다음과 같다.

 

public class Department {
    private int departmentId;
    private String departmentName;
    private int parentDepartmentId;

    // 생성자, getter, setter는 생략

    // 재귀적으로 부서 계층을 출력하는 메서드
    public static void printDepartmentHierarchy(List<Department> departments, int startDepartmentId, String prefix) {
        for (Department department : departments) {
            if (department.getParentDepartmentId() == startDepartmentId) {
                System.out.println(prefix + department.getDepartmentName());
                printDepartmentHierarchy(departments, department.getDepartmentId(), prefix + "  ");
            }
        }
    }

    public static void main(String[] args) {
        // 가상의 부서 데이터 생성
        List<Department> departments = new ArrayList<>();
        departments.add(new Department(1, "IT", 0));
        departments.add(new Department(2, "Development", 1));
        departments.add(new Department(3, "Testing", 1));
        departments.add(new Department(4, "HR", 0));
        departments.add(new Department(5, "Recruitment", 4));
        departments.add(new Department(6, "Training", 4));
        departments.add(new Department(7, "Training2", 1));
        departments.add(new Department(8, "Training3", 6));

        // 시작 부서 ID 지정
        int startDepartmentId = 0;

        // 재귀적으로 부서 계층 출력
        printDepartmentHierarchy(departments, startDepartmentId, "");
    }

 

출력 

IT
  Development
  Testing
  Training2
HR
  Recruitment
  Training
    Training3

 

위와 같이 계층구조로 나온 것을 확인 할 수 있다.

 

직접 적용해보면 더 와닿을 거 같다.

 

참고 : https://horang98.tistory.com/10

 

[MySQL] 계층 쿼리 - WITH, WITH RECURSIVE 사용법

Common Table Expression (CTE) WITH 구문은 메모리 상에 가상의 테이블을 저장할 때 사용된다. RECURSIVE의 여부에 따라 재귀, 비재귀 두 가지 방법으로 사용 가능하다. WITH [RECURSIVE] TABLE명 AS ( SELECT - # 비반

horang98.tistory.com