재귀쿼리?
재귀쿼리란 자기 자신을 반복적으로 불러내서 가상의 테이블 생성할 수 있는 쿼리문이다.
재퀴쿼리는 계층구조를 나타내려는 경우에 유용하다.
WITH RECURSIVE tb명 AS (
SELECT 1 속성명 -- 비 반복문 (반복 X)
UNION ALL
SELECT 속성명 + 1 AS 속성명 -- 반복문
FROM tb명
WHERE 재귀쿼리 종료 조건
)
SELECT * FROM tb명;
📢 두가지의 예시를 소개하겠다.
1. 세대 구하기
해당 예시는 프로그래머스 SQL 코딩테스트 연습 문제이다.
데이터베이스의 테이블이 위에 처럼 주어졌을 때,
각 ID가 몇 세대인지 나타내는 쿼리문을 작성해보겠다.
WITH RECURSIVE LV_TB AS
(
SELECT ID, PARENT_ID, 1 AS GENERATION
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
SELECT A.ID, A.PARENT_ID, B.GENERATION + 1
FROM ECOLI_DATA A
INNER JOIN LV_TB B
ON A.PARENT_ID = B.ID
)
SELECT * FROM LV_TB;
해당 쿼리에서는 WHERE 조건문으로 종료하고 있지 않다.
모든 데이터들의 계층을 알기 위해 테이블의 데이터들을 모두 돌아야하기 때문이다.
위 쿼리문의 결과는 아래와 같다.
2. 월별 카운트
차트를 만드는 작업 시, 데이터가 없는 특정 월의 경우에도 데이터 값이 0으로 나와야하는 경우가 있다.
이럴 때, 재귀쿼리문을 사용하면 된다!!
WITH RECURSIVE SALES_FOR_MONTH AS (
SELECT 1 AS MONTH
UNION ALL
SELECT MONTH + 1
FROM SALES_FOR_MONTH
WHERE MONTH < 12
)
SELECT A.MONTH
, COUNT(B.ID) CNT
FROM SALES_FOR_MONTH A
LEFT JOIN RESERVATION B
ON A.MONTH = MONTH(B.CONFIRM_AT)
GROUP BY A.MONTH;
12월까지밖에 없기 때문에 WHERE 조건문으로 12월까지만 생성되도록 조건을 걸어줘야한다.
데이터가 4월 3개뿐이라 잘못 나온 것처럼 보이지만 현재 테이블 데이터가 4월에 3개뿐이라 그렇다...!
[출처]
'MySQL' 카테고리의 다른 글
[MySQL] ROUND, CEILING, FLOOR 함수 (0) | 2024.07.29 |
---|---|
[MySQL] 트리거 생성 시 Error Code : 1419 대처하기 (0) | 2024.04.04 |