데이터 간의 계층 관계를 행과 열로 이루어진 표에서 직관적으로 표현하는 것은 쉬운일이 아니다. 그 어려운 일을 SQL은 재귀쿼리를 이용해서 시각화 해줄 수 있다. 단 계층을
재귀쿼리 RECURSIVE QUERY
01 재귀쿼리란?
재귀쿼리의 이름을 먼저 살펴보도록 하자. 재귀라는 것은 영어로는 RECURSIVE, 즉 반복의 의미를 담고 있다. 재귀쿼리는 다시 말해서 반복적으로 작동될 쿼리라고 할 수 있고 '어떠한 쿼리를 반복적으로 실행한다' 라고 이해하면 좋다. 그렇다면 반복적인 작업이 왜 필요할까? 이유는 자료들의 계층을 파악하기 위해서이다. 데이터들은 각각 종속성과 피종속성을 갖지고 있다. 단순하지 않은 그런 속성을 한 번 데이터를 읽음으로서 완벽히 파악하기 어렵다. 따라서 그럴 때 재귀쿼리를 이용해 종속의 종속의 종속... 과 같이 반복되는 종속성을 파악해서 계급도나 가문도 같은 데이터의 계층 구조를 정확히 파악할 수 있다.
02 재귀쿼리 작성하는 방법 : WITH RECURSIVE
그렇다면 재귀쿼리는 어떻게 작성할까? 재귀쿼리는 임시 테이블을 불러올 때 사용했던 WITH에 RECURSIVE를 함께 작성하고 테이블들을 합칠 때 사용 했던 집합연산자 UNION 혹은 UNION ALL을 이용해서 다음과 같은 형식으로 작성한다.
WITH RECURSIVE TEMP_NAME (COL_1, COL_2,...) AS (
NON_RECURSIVE_QUERY
UNION ALL
RECURSIVE_QUERY
)
SELECT COL1, COL2, TREATED_COL
FROM TEMP_NAME
;
EXAMPLE
재귀쿼리를 이용해서 2부터 10까지의 리스트를 만들어주세요.
WITH RECURSIVE NUMBER (NO) AS (
SELECT 2
FROM NUMBER
UNION ALL
SELECT N+1
FROM NUMBER
WHERE N+1 <= 10
)
SELECT NO
FROM NUMBER
;
위의 예시를 통해서 NON_RECURSIVE_QUERY 영역에서 시작 부분을 설정한다는 것을 알 수 있다. 만약 3부터 리스트를 만든다면 2대신 3을 작성하면 된다. 기본적인 QUERY를 이용해서 NON_RECURSIVE_QUERY를 작성한다면 시작 부분 조건을 WHERE절을 이용해서 설정할 수 있다.
EXAMPLE
담당 메니저를 기준으로 직장내 부서 위치도를 보여주세요.
WITH RECURSIVE TEMP_MEMBER AS (
SELECT M1.EMPLOYEE_ID, M1.MANAGER_ID, M1.DEPARTMENT_NAME, M1.NAME, 0 LVL
FROM MEMBER M1
WHERE EMPLOYEE_ID = 1
UNION ALL
SELECT M2.EMPLOYEE_ID, M2.MANAGER_ID, M2.DEPARTMENT_NAME, M2.NAME, M1.LVL + 1
FROM MEMBER M2, MEMBER M1
WHERE M2.MANAGER_ID = M1.EMPLOYEE_ID
)
SELECT EMPOLYEE_ID, MANAGER_ID, DEPARTMENT_NAME, LPAD(' ', 4 * (LVL)) || NAME AS NAME
FROM TEMP_MEMBER
;
NON_RECURSIVE_QUERY 영역 WHERE절에서 EMPLOYEE_ID를 1로 설정하므로써 사원ID가 1인 사람을 시작으로 RECURSIVE_QUERY 영역이 작동하기 시작한다.
SUMMARY
- RECURSIVE QUERY라고 불리는 재귀쿼리는 반복적인 작업을 할 때 사용된다.
- 이런 반복적인 작업은 데이터 셋안의 계층 구조를 확인할 때 유용하게 사용할 수 있다.
- 재귀 쿼리는 WITH RECURSIVE 로 시작하고 UNION 혹은 UNION ALL을 이용해서 NON RECURSIVE QUERY (비재귀쿼리)와 RECURSIRVE QUERY (재귀쿼리)를 합치는 쿼리를 갖는 형태를 갖고 있다.
* 오타 및 잘못된 내용이 있다면 댓글로 알려주세요!
'ICT > SQL' 카테고리의 다른 글
SQL 문법 | 순위 함수 | RANK, DENSE_RANK, ROW_NUMBER (0) | 2021.09.30 |
---|---|
SQL 문법 | 데이터 타입 변환 함수 | CAST (0) | 2021.09.29 |
[SQL] SQLD SQLP 결과발표일 및 확인방법 (0) | 2021.09.23 |
SQL 문법 | 데이터 조회 및 필터 | WITH (0) | 2021.09.22 |
SQL 문법 | 데이터 조회 및 처리 | CASE WHEN THEN ELSE END (0) | 2021.09.20 |
댓글