재귀함수 - 리커시브 쿼리 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
'알고리즘' 카테고리의 다른 글
알고리즘 - 프로그래머스([3차]진수 게임) - 자바 (1) | 2022.09.29 |
---|---|
알고리즘 - 프로그래머스(타겟넘버) (0) | 2022.08.15 |
알고리즘 - 프로그래머스([1차] 비밀지도) (0) | 2022.08.13 |
알고리즘 - 프로그래머스(숫자 문자열과 영단어) (0) | 2022.08.11 |
알고리즘 - 프로그래머스(신규아이디 추천) (0) | 2022.08.09 |