employees
와 departments
두 테이블을 사용하는 샘플 시나리오를 고려하여 Oracle의 WITH
문 사용법을 다양한 복잡도로 설명합니다.
employees
employee_id | first_name | last_name | department_id | salary |
---|---|---|---|---|
1 | John | Doe | 1 | 50000 |
2 | Jane | Smith | 2 | 60000 |
3 | Bob | Johnson | 1 | 70000 |
4 | Sarah | Miller | 3 | 55000 |
department
department_id | department_name |
---|---|
1 | 영업 |
2 | 엔지니어링 |
3 | 인사 |
WITH
문을 사용한 예제 쿼리직원 세부 정보를 가져오기
WITH EmployeeDetails AS (
SELECT employee_id, first_name, last_name, salary
FROM employees
)
SELECT *
FROM EmployeeDetails
WHERE salary > 55000;
WITH DepartmentEmployees AS (
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
)
SELECT *
FROM DepartmentEmployees
WHERE department_name = '영업';
부서별 평균 급여 계산
WITH DepartmentSalary AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT d.department_name, ds.avg_salary
FROM DepartmentSalary ds
JOIN departments d ON ds.department_id = d.department_id;
계층적 데이터에 유용한 재귀입니다.
WITH RECURSIVE EmployeeHierarchy AS (
SELECT employee_id, first_name, 0 AS depth
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.employee_id, e.first_name, eh.depth + 1
FROM employees e
JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
)
SELECT *
FROM EmployeeHierarchy;
참고: 이 쿼리는 manager_id
열이 존재한다고 가정하며 관리 구조에 기반한 계층을 구성합니다.
복잡한 데이터 분석을 위해 여러 CTE를 결합합니다.
WITH SalesDepartment AS (
SELECT employee_id
FROM employees
WHERE department_id = 1
), HighEarningSales AS (
SELECT employee_id
FROM SalesDepartment
WHERE salary > 65000
)
SELECT e.first_name, e.last_name
FROM employees e
JOIN HighEarningSales hs ON e.employee_id = hs.employee_id;
실무에서 WITH문을 상당히 많이 사용한다.
특히, WITH문 없이 JOIN문을 사용하려고 할 때, JOIN에 얽힌 테이블의 관계수가 많을 경우 WITH문으로 짝을 2개 정도씩 묶은 이후 WITH문 밖에서 메인 쿼리를 진행하게 하여 가독성이 높아지게 한다.
이러한 기능이 있어 매우 편리한 것 같다.