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을 깔끔하게 정리하고
- 재사용성과 성능까지 개선할 수 있는
실무 필수 기능입니다.
반응형
'DB > ORACLE' 카테고리의 다른 글
| ORACLE ORA-00257: archiver error 해결 방법 (0) | 2026.03.26 |
|---|---|
| ORACLE SUBSTR vs REGEXP_SUBSTR 차이점 (0) | 2026.03.25 |
| ORACLE 문자열 자르기 (0) | 2026.03.25 |
| ORACLE 테이블 복사하기 (0) | 2026.03.24 |
| ORACLE 프로시저 특정 문자열 검색 조회 (0) | 2025.03.27 |