[SQL 심화] 재귀함수 Recursion Function 이해하기

Hyeon·2024년 10월 15일

SQL 문제 풀이

목록 보기
25/61

📍 재귀함수 Recursion Function

◻ 재귀함수 기본 원리

  • 재귀함수란? 함수에서 자기 자신을 다시 호출해서 작업을 수행하는 방식이다.
  • 반복문을 구현할때 사용하며, 특정 분기까지 자기자신을 계속해서 호출한다.
  • 일정 조건 만족시 함수를 이탈하여 결과를 도출한다.```
    코드를 입력하세요

◻ 재귀함수 주의사항

  • 가상 테이블을 메모리상에 저장
  • 반드시 UNION을 사용해야함
  • 비반복문 최소한 1개 요구된다
  • 반복되는 문장에서 정지조건이 꼭 포함되어야함

💌 재귀함수 예시 1)

with recursive rc as (
-- 재귀 초깃값
select 0 as h
-- union 사용
union all
select h+1
from rc
-- 재귀 정지 조건
where h<5 )
select * from rc

💌 재귀함수 예시 2) : 프로그래머스 입양 시각 구하기(2)

문제 설명

코드

-- 1) 0부터 23까지 숫자 연속 출력
with recursive rc as (
-- 재귀 초깃값
select 0 as h

-- union 사용
union all
select h+1
from rc
where h<23),

-- 2) 각 시간대별로 입양 건수 출력(ANIMAL_OUTS 테이블)
cte_2 as (
select hour(datetime) as hour ,count(ANIMAL_ID) as count_animal
from ANIMAL_OUTS
group by hour(datetime) )

-- 1) & 2) LEFT JOIN하여 모든 시간대의 입양 건수가 출력되도록 하기
-- 이때 NULL 값은 0이 되도록 처리
select h as HOUR, ifnull(count_animal, 0) as COUNT
from rc a left join cte_2 b

on a.h= b.hour;

출력된 결과

💌 재귀함수 예시 3) : 회사 조직도 계층 구하기

데이터 설명 (회사 조직 구조는?)

원본 데이터

부서별 계층이 도드라져 보일 수 있도록 재귀 함수를 활용하여 계층 구조 컬럼을 생성하자!

코드(계층형 쿼리 만들기)

with recursive cte_1 as (
-- 1. 최상위 계층 구하기 : PARENT 부서가 없을 때
-- FULLPATH (DEPT_NM) & LEVEL (계층)컬럼 생성
select DEPT_CD, PARENT_DEPT_CD, DEPT_NM , DEPT_NM AS FULLPATH, 0 AS LEVEL
from DEPT_TABLE
where PARENT_DEPT_CD IN ('') or PARENT_DEPT_CD IS NULL

UNION ALL
-- 출력 구문 (하위 조직)
SELECT B.DEPT_CD, B.PARENT_DEPT_CD, B.DEPT_NM, CONCAT(CTE_1.FULLPATH,'>',B.DEPT_NM) AS FULLPATH,
CTE_1.LEVEL + 1 AS LEVEL
FROM DEPT_TABLE B
-- INNER JOIN하여 부모계층과 일반 계층 연결
INNER JOIN CTE_1 ON CTE_1.DEPT_CD = B.PARENT_DEPT_CD
)

-- SPACE 함수를 이용하여 DEPT_CD에 공백 넣어 계층 구분
SELECT CONCAT(SPACE(LEVEL*2),DEPT_CD) AS DEPT_CD, PARENT_DEPT_CD,DEPT_NM, FULLPATH, LEVEL
FROM CTE_1;

결과값

출처
https://hongik-prsn.tistory.com/78

0개의 댓글