DB/ORACLE

ORACLE WITH 절(서브쿼리 팩토링) 사용법

devmean 2026. 3. 24. 15:25

SQL을 작성하다 보면 같은 서브쿼리를 여러 번 사용하거나, 쿼리가 너무 길어져서 가독성이 떨어지는 경우가 많습니다.
이럴 때 사용하는 것이 바로 WITH 절(Common Table Expression, CTE) 입니다..


1. WITH 절이란?

WITH 절은 서브쿼리에 이름을 붙여 재사용할 수 있도록 하는 기능입니다.


2. 기본 문법

WITH 별칭 AS (
    서브쿼리
)
SELECT *
FROM 별칭;

3. 기본 사용 예제

✔ 단일 WITH 절

WITH UserList AS (
    SELECT UserID, UserName
    FROM Users
    WHERE Age >= 20
)
SELECT *
FROM UserList;

UserList라는 임시 결과를 만들어서 사용하는 구조입니다.


4. 여러 개 WITH 절 사용하기

여러 개의 서브쿼리를 정의할 수도 있습니다.

WITH
A AS (
    SELECT UserID, Age FROM Users WHERE Age >= 20
),
B AS (
    SELECT UserID, OrderDate FROM Orders WHERE OrderDate >= DATE '2024-01-01'
)
SELECT A.OrderID, A.Age, B.OrderDate
FROM A
INNER JOIN B ON A.UserID = B.UserID;

복잡한 쿼리를 단계별로 나눌 수 있어 가독성이 크게 향상됩니다.


5. WITH 절 재사용하기

같은 결과를 여러 번 사용할 때 매우 유용합니다.

WITH SalesData AS (
    SELECT UserID, SUM(Amount) AS TotalAmount
    FROM Sales
    GROUP BY UserID
)
SELECT UserID, TotalAmount
FROM SalesData
WHERE TotalAmount > 1000

UNION ALL

SELECT UserID, TotalAmount
FROM SalesData
WHERE TotalAmount <= 1000;

동일한 집계 결과를 여러 번 계산하지 않아 성능에도 도움이 됩니다.


6. WITH 절 vs 서브쿼리

구분WITH 절서브쿼리

가독성 매우 좋음 복잡해질 수 있음
재사용 가능 불가능
유지보수 쉬움 어려움

잡한 쿼리일수록 WITH 절을 사용하는 것이 유리합니다.


7. 재귀 WITH 절 (Recursive WITH)

Oracle에서는 계층 구조 데이터를 처리할 때 WITH 절을 재귀적으로 사용할 수 있습니다.

WITH EmpHierarchy (EmpID, ManagerID, LevelNo) AS (
    SELECT EmpID, ManagerID, 1
    FROM Employees
    WHERE ManagerID IS NULL

    UNION ALL

    SELECT e.EmpID, e.ManagerID, h.LevelNo + 1
    FROM Employees e
    JOIN EmpHierarchy h
      ON e.ManagerID = h.EmpID
)
SELECT *
FROM EmpHierarchy;

조직도, 트리 구조 데이터 처리에 매우 유용합니다.


8. WITH 절 사용 시 장점

  • 쿼리 가독성 향상
  • 반복되는 서브쿼리 제거
  • 유지보수 편의성 증가
  • 복잡한 로직을 단계별로 표현 가능

9. 주의사항

  • 너무 많은 WITH 절 사용 시 오히려 가독성이 떨어질 수 있음
  • 경우에 따라 성능이 서브쿼리보다 느릴 수도 있음
  • Oracle 버전에 따라 최적화 방식이 다를 수 있음

마무리

WITH 절은 단순한 문법이지만, 잘 활용하면

  • 복잡한 SQL을 깔끔하게 정리하고
  • 재사용성과 성능까지 개선할 수 있는

실무 필수 기능입니다.

반응형