본문 바로가기
MySQL

[MySQL] 재귀쿼리 WITH RECURSIVE

by 네모세모동동 2024. 7. 6.

재귀쿼리?

재귀쿼리란 자기 자신을 반복적으로 불러내서 가상의 테이블 생성할 수 있는 쿼리문이다.

 

재퀴쿼리는 계층구조를 나타내려는 경우에 유용하다.

 

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