- RECURSIVE와 WITH, 재귀적으로 데이터 조회하기
Oracle에서도 MySQL과 같이 재귀 쿼리가 존재한다. Oracle에서의 재귀 쿼리는 다음과 같다.
WITH
-- Anchor Member: 초기 쿼리 부분, 재귀를 시작하는 지점
OrgChart (employee_id, name, manager_id, level) AS (
SELECT employee_id, name, manager_id, 0 AS level
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- Recursive Member: 재귀적으로 반복되는 쿼리 부분
SELECT e.employee_id, e.name, e.manager_id, oc.level + 1
FROM employees e
INNER JOIN OrgChart oc ON e.manager_id = oc.employee_id
)
-- Termination Condition: 재귀를 종료하는 조건은 따로 명시하지 않음
-- 최상위 매니저를 찾고 그 하위 직원을 재귀적으로 계속 조회함
SELECT * FROM OrgChart;
Oracle에서 재귀 쿼리를 구현하는 방법은 기본적으로 MySQL과 유사하지만, WITH clause 구문을 사용하여 CTE를 정의한다. 이를 통해 계층적 데이터를 쉽게 조회하고 처리할 수 있다.
- WITH란 무엇인가?
Oracle에서 WITH 구문은 CTE(Common Table Expressions)를 정의하는 데 사용된다. CTE는 쿼리 내에서 임시로 정의되는 이름이 지정된 결과 집합이며, 이를 통해 복잡한 쿼리를 단순화하고 가독성을 향상시킬 수 있다.
WITH 구문은 다음과 같이 사용된다.
WITH
cte_name (column1, column2, ...) AS (
-- CTE 쿼리 정의
SELECT column1, column2, ...
FROM ...
WHERE ...
)
-- 기본 쿼리에서 CTE 사용
SELECT ...
FROM ...
JOIN cte_name ON ...
WHERE ...
여기서 cte_name은 CTE의 이름을 지정하는 부분이며, column1, column2, ...은 CTE의 결과 집합에서 반환할 열이다. CTE 쿼리는 괄호 내에 정의되며, 기본 쿼리에서는 CTE를 테이블처럼 사용할 수 있다.
이처럼 WITH 구문을 사용하여 Oracle에서도 재귀 쿼리를 구현할 수 있다.