with recursive 뷰명 as(
초기 SQL
union all(or union)
반복할 SQL(+반복을 멈출 WHERE절 포함)
)select * from 뷰명;
원리
1. 초기 SQL을 실행하면 실행한 결과셋은 recursive문을 선언할 때 기재한 뷰에 담긴다.
2. 반복할 SQL의 FROM 절에 뷰명을 이용해서 처리하거나 한다. 이는 상황에 따라 다르지만 주로 뷰명을 FROM절에 두고 반복문을 돌리는 것이 일반적이다.
3. union 혹은 union all 연산을 한다.
4. 반복할 SQL에서 하나의 레코드가 나오지 않을 때 recursive문을 탈출한다.
5. recursive문을 탈출 한 후 뷰명에 연산된 결과셋이 다시 담기게되고 뷰처럼 조회할 수 있다.
예시
ex) 1개의 컬럼으로 100개의 레코드가 1~10형태로 나올 recursive
with recursive test as(
select 1 as num
union all
select num+1 from test where num < 10
)select * from test;
- 초기 select에서 1 상수를 alias num으로 컬럼명을 정한다.
- VIEWNAME(test)으로 초기 select select 결과를 조회할 수 있다.
- 반복 select 문에서 VIEWNAME(test)으로 num을 조회하고 1을 더한다. 그럼 num이 2인 select 결과가 생성되고 이런식으로 union all 연산이 일어난다.
- 반복해서 num이 10이었을 때 num where 절에 만족하지 못하고 아무 레코드도 반환되지 않으면서 recursive 반복문이 끝나게 된다.
- 마지막에 전체 union된 결과를 VIEWNAME(test)으로 조회하면 아래 결과가 나온다.