RECURSIVE
여부에 따라 재귀와 비재귀 두 방법으로 사용 가능비슷하게 동작하는 뷰
와의 차이점: 뷰
는 별칭만 지정하는 것이므로 쿼리문이 그대로 실행된다. 그러나 WITH
는 가상의 테이블을 생성한다.
장시간 걸리는 쿼리의 결과를 저장해놓고 저장해놓은 데이터를 엑세스하기 때문에 성능이 좋다. 대신 메모리를 차지하는 단점이 있다.
예시 1 )
WITH TBL AS (
SELECT '철수' AS NAME, 20 AS AGE
UNION ALL
SELECT NAME, AGE
FROM TB1
)
SELECT NAME, AGE FROM TBL;
예시 2 )
# UNION 결과 : 1,2 출력
SELECT 1 AS num
UNION
SELECT 2 AS num;
# WITH, UNION 결과 : 1,2 출력
WITH test AS
(
SELECT 1 AS num
UNION ALL
SELECT 2 AS num
)
SELECT * FROM test;
# WITH, UNION 결과 : 1,2,2,2,... (emp테이블의 행수만큼 2 반복)
WITH test AS
(
SELECT 1 AS num
UNION ALL
SELECT 2 AS num FROM emp # 이 문장은 emp 테이블의 행수만큼 반복된다
)
SELECT * FROM test;
WITH RECURSIVE
쿼리문을 작성하고 내부에 UNION
을 통해 재귀를 구성한다.
예시 ) 0부터 10까지의 값을 갖는 가상 테이블 생성
WITH RECURSIVE CTE AS(
SELECT 0 AS NUM - 초깃값
UNION ALL
SELECT NUM + 1
FROM CTE
WEHRE NUM < 10 - 정지 조건
)
관련 문제
프로그래머스 입양 시각 구하기(2)