본문 바로가기

STUDY/SQL, DB

[MySQL] WITH RECURSIVE 구문

 

SQL에서 재귀 쿼리 짤 때 사용하는 구문이다.

 

구문 작성하는 방법이 좀 독특한데, 아래와 같다.

WITH RECURSIVE cte_count 
AS ( 
    -- Non-Recursive 문장( 첫번째 루프에서만 실행됨 )
    SELECT 1 AS n
    UNION ALL
    -- Recursive 문장(읽어 올 때마다 행의 위치가 기억되어 다음번 읽어 올 때 다음 행으로 이동함)
    SELECT n + 1
    FROM cte_count
    WHERE n < 3 
)

SELECT * FROM cte_count;

 

1. 메모리 상에 가상의 테이블을 저장한다.
2. 반드시 UNION 사용해야한다.
3. 최소한 하나의 비반복문(Non-Recursive)이 있어야 한다. 처음 한번만 실행된다.
4. 서브쿼리에서 바깥의 가상의 테이블을 참조하는 문장(반복문)이 반드시 필요하다.
5. 반복되는 쿼리는 반드시 정지조건(Termination condition)이 있어야 한다.
6. 가상의 테이블을 구성하면서 그 자신(가상의 테이블)을 참조하여 값을 결정할 때 유용하다.

 

출처 : https://www.mysqltutorial.org/mysql-recursive-cte

 

 

 

간단하게 예시를 들어 보면 다음과 같다.

 

 

 

 

 

프로그래머스의 입양 시각 구하기(2) 문제를 풀다가 알게 된 구문이다.

실제 문제 풀이에는 아래의 문제풀이 포스팅과 같이 적용될 수 있을 것이다. 

 

[코딩테스트/SQL - 프로그래머스] - SQL 고득점 kit(GROUP BY) - 입양 시각 구하기(2)

 

SQL 고득점 kit(GROUP BY) - 입양 시각 구하기(2)

처음에 문제만 읽었을 때엔 아니 띠용? 이렇게 쉬운 문제가 Lv 4? 라고 생각했으나, 예시 답안을 보니 Lv4일만 했다. 기록이 없는 빈 시간대의 데이터도 만들어야 했기 때문이다. 참고로 입양 시각

k-wien1589.tistory.com

 

재귀문을 사용해서 뭔가를 출력해야 할 일이 있을 때에 유용하게 써 보도록 하자!

'STUDY > SQL, DB' 카테고리의 다른 글

[MySQL] temporary table  (0) 2024.03.05
[MySQL] 비트(bit) 연산자  (2) 2024.02.29
[SQL] 데이터 타입 훑어보기  (0) 2024.02.15
[DBeaver] Data import하기  (0) 2024.02.15
[DBeaver] DB에 "처음"연결하기  (0) 2024.02.15