GROUP BY 에 WITH RECURSIVE 문제
WITH RECURSIVE
WITH 구문은 메모리 상에 "가상의 테이블"을 저장할 때 사용된다. RECURSIVE 여부에 따라 재귀, 비재귀 두 가지 방법이 가능한 것.
WITH RECURSIVE
- 가상 테이블을 생성하는데, 가상테이블이 자신의 값을 참조하여 값을 결정할 때 사용됨.
- 예시 : 0~10의 값을 갖는 임시 테이블을 생성해라.
WITH RECURSIVE CTE AS( SELECT 0 AS NUM # 초기값 설정 UNION ALL SELECT NUM+1 FROM CTE WHERE NUM<10 #반복 멈추는 구간 설정 )
WITH RECURSIVE 를 쓴 이유는,
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT FROM ANIMAL_OUTS GROUP BY HOUR ORDER BY HOUR
IFNULL(A.COUNT,0)
처리를 해줘야, NULL인 경우 빈칸이 아닌 0이 채워져서 나온다. LEFT JOIN
인 이유는, ANIMAL_OUTS 테이블에 데이터가 없더라도, 임시 테이블인 CTE의 값은 다 나와야 되기 때문이다.🙆♀️ 정답 풀이
WITH RECURSIVE CTE AS( SELECT 0 AS NUM UNION ALL SELECT NUM+1 FROM CTE WHERE NUM<23 ) SELECT CTE.NUM, IFNULL(A.COUNT,0) COUNT FROM CTE LEFT JOIN ( SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT FROM ANIMAL_OUTS GROUP BY HOUR ORDER BY HOUR) A ON CTE.NUM=A.HOUR;