- 재귀함수란? 함수에서 자기 자신을 다시 호출해서 작업을 수행하는 방식이다.
- 반복문을 구현할때 사용하며, 특정 분기까지 자기자신을 계속해서 호출한다.
- 일정 조건 만족시 함수를 이탈하여 결과를 도출한다.```
코드를 입력하세요
with recursive rc as (
-- 재귀 초깃값
select 0 as h
-- union 사용
union all
select h+1
from rc
-- 재귀 정지 조건
where h<5 )
select * from rc

-- 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;



부서별 계층이 도드라져 보일 수 있도록 재귀 함수를 활용하여 계층 구조 컬럼을 생성하자!
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;
