[Postgresql] recursive 문이란?? 개념 및 예제
신입으로 처음 들어간 회사에서 oracle DB말고 postgresql이라는 DB를 사용해서 Postgresql을 처음 배웠을때
recursive 문을 배웠습니다. 자바의 for문과 비슷한 원리로 돌아가는 반복문인데 구조는 다음과 같습니다.
recursive문의 기본 구조
1 2 3 4 5 6 7 8 | with recursive 뷰명 as( 초기 SQL union all(or union) 반복할 SQL(+반복을 멈출 where절 포함) )select * from 뷰명; | cs |
원리
1. 초기 SQL을 실행하면 실행한 결과셋은 recursive문을 선언할때 기재한 뷰에 담긴다.
2. 반복할 SQL의 from 절에 뷰명을 이용해서 처리하거나 한다. 이는 상황에 따라 다르지만 주로 뷰명을 from절에 두고 반복문을 돌리는 것이 일반적이다.
3. union 혹은 union all 연산을 한다.(경우에따라 다름 마이너스도 가능)
4. 반복할 SQL에서 단하나의 레코드가 나오지 않을때 recursive문을 탈출한다.
5. recursive문을 탈출하였으면 뷰명에 연산된 결과셋이 다시 담기게되고 뷰처럼 조회할 수 있다.
응용문제
- 1개의 컬럼으로 10개의 레코드가 1~10형태로 나올 recursive 문을 짜시오.
1 2 3 4 5 6 7 | with recursive VIEWNAME as( select 1 as num union all select num+1 from VIEWNAME where num < 10 )select * from VIEWNAME; | cs |
1. 초기 select에서 1상수를 alias num으로 컬럼명을 정한다.
2. VIEWNAME으로 초기 select 결과를 조회할 수 있다.
3. 반복 select 문에서 VIEWNAME으로 num을 조회하고 1을 더한다. 그럼 num이 2인 select 결과가 생성되고
1 |
2 |
이런식으로 union all 연산이 일어난다.
4. 반복해서 num이 10이었을때 num where 절에 만족하지 못하고 아무 레코드도 반환되지 않으면서 recursive 반복문이 끝나게 된다.
5. 마지막에 전체 union 된 결과를 VIEWNAME으로 조회하면
결과셋