가상의 테이블을 만들고, 그 테이블의 값을 참조하여 값을 결정하기 위해 사용되는 쿼리문이다. 자기 자신을 참조하기 때문에 재귀쿼리라고 불린다.
WITH RECURSIVE test AS (
-- Non-Recursive 문장( 첫번째 루프에서만 실행됨 )
SELECT 1 AS num
UNION ALL
-- Recursive 문장(읽어 올 때마다 행의 위치가 기억되어 다음번 읽어 올 때 다음 행으로 이동함)
SELECT num+1 AS num FROM test WHERE num<10
)
SELECT * FROM test;
반드시 UNION을 사용해야한다.
문법 상 SELECT를 무조건 두 번 사용해야하기 때문에 UNION이 꼭 필요하다.
비반복문(Non-Recursive 문장)이 최소한 1개 요구된다. 처음 한 번만 실행된다.
비반목문이란 처음 적는 SELECT를 의미한다.
가상 테이블을 참조하는 문장(반복문, Recursive 문장)이 반드시 필요하다.
반복되는 문장은 반드시 정지조건이 요구된다.
WHERE절에 쓰는 문장이 정지조건이다. 조건을 쓰지 않으면 무한루프문이 되므로 주의해야한다.
with recursive rc as (
select 0 as hour
union all
select hour+1 from rc where hour<23
)
select
rc.hour,
count(hour(A.datetime)) as count
from rc
left join animal_ins as A
on rc.hour = hour(A.datetime) -- 재귀숫자와 datetime 시간숫자가 같은 것만
group by rc.hour -- 집계함수를 썼으니 그룹핑, 안그러면 다 더해서 레코드 하나만 반환
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-RECURSIVE-%EC%9E%AC%EA%B7%80-%EC%BF%BC%EB%A6%AC