안녕하세요.
오늘은 파이썬의 for문과 비슷한 원리로 돌아가는 반복문이자 재귀쿼리 with recursive에 대해 알아보겠습니다.
with recursive 구조 및 원리
▣ MySQL 기본 구조 (MySQL 5.7 이하 미지원)
WITH RECURSIVE 테이블 or 뷰 AS (
초기 SQL문 --SELECT문
UNION ALL
반복할 SQL문 --SELECT문+WHERE 조건문
)
SELECT문 FROM 테이블 OR 뷰;
▣ 원리 설명
- 초기 SQL문(called by anchor member)을 실행하면 RECURSIVE문을 선언할 때 기재한 테이블이나 뷰에 담긴다.
- 반복할 SQL문(called by recursive member)의 FROM절에 앞선 테이블이나 뷰명을 이용해서 처리하거나 한다.
- UNION 혹은 UNION ALL 연산을 한다. (경우에 따라 다르며 UNION DISTINCT도 사용 가능)
- 반복할 SQL문에서 단 하나의 레코드가 나오지 않을 때, 즉 recursive member가 row를 반환하지 않을 때 반복문을 탈출한다.
- recursive문을 탈출하였으면 뷰명에 연산된 결과셋이 다시 담기게되고 뷰처럼 조회할 수 있다.
반응형
with recursive 예제
▣ 프로그래머스 입양 시각 구하기(2)
▣ 예제 풀이 in MySQL
## WITH RECURSIVE PROGRAMMERS ##
WITH RECURSIVE TEMP AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1
FROM TEMP
WHERE HOUR < 23)
SELECT TEMP.HOUR AS HOUR, COUNT(ANIMAL_OUTS.DATETIME) AS COUNT
FROM TEMP LEFT JOIN ANIMAL_OUTS
ON TEMP.HOUR = HOUR(ANIMAL_OUTS.DATETIME)
GROUP BY HOUR;
해당 문제는 다른 방식으로 풀었던 적이 있어 과거 포스팅했던 글을 아래에 올립니다.
2020.08.24 - [코딩테스트/프로그래머스] - [프로그래머스] SQL GROUP BY 입양 시각 구하기(2)
반응형
'Programming > SQL' 카테고리의 다른 글
[MySQL] auto_increment 자동증가 설정 (0) | 2022.10.26 |
---|---|
SQL 조건문 (CASE WHEN, DECODE) (0) | 2022.07.17 |
[SQL] 와일드카드 문자 (패턴 일치) (0) | 2022.01.30 |
[MySQL] 수학함수 다루기 (0) | 2022.01.17 |
[MySQL] View 다루기 (Create, Replace, Drop) (0) | 2021.12.05 |
댓글