Oracle 에서 SQL 문장에 WITH 절을 사용하는 예
개요
Oracle에서 WITH 절은 서브커리에 속하며 메모리에 생성되는 임시 테이블, 혹은 인라인 뷰 개념으로 설명할 수 있다.
SQL 문장에서 WITH 절은 SQL-99 표준이며 오라클에서는 Oracle 9.2 버전부터 지원되기 시작했다
"WITH clause may be processed as an inline view or resolved as a temporary table."
기존의 인라인 뷰와 WITH 절이 이끄는 인라인 뷰가 가지는 장점은 동일한 인라인 뷰를 중복하여 선언하는 경우를 없앨 수 있다는 것이다
일반적인 Inline-View 와 WITH 절을 이용한 Inline-View 가 별 차이점이 없는 경우
-- WITH Clause 예제: 동일한 서브커리를 중복해서 선언할 필요가 없다
-- WITH절을 사용하지 않은 서브커리(인라인 뷰)
SELECT e.ename, e.deptno,
dc.dept_count AS emp_dept_count
FROM emp e,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc
WHERE e.deptno = dc.deptno
ORDER BY e.deptno;
-- WITH 절을 사용하여 Inline-View를 선언한 경우, 위와 별 차이가 없다
WITH dept_count AS (
SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT e.ename, e.deptno,
dc.dept_count AS emp_dept_count
FROM emp e,
dept_count dc
WHERE e.deptno = dc.deptno
ORDER BY e.deptno;
일반적인 Inline-View 에 대해 WITH 절을 이용한 Inline-View 가 장점을 가지는 경우
-- WITH 절을 사용하지 않는 경우, 동일한 서브커리를 중복해서 선언해야 하는 경우가 있다
-- 사원의 이름과 관리자의 이름을 함께 출력하는 경우
SELECT e.ename AS employee_name,
dc1.dept_count AS emp_dept_count,
m.ename AS manager_name,
dc2.dept_count AS mgr_dept_count
FROM emp e,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc1,
emp m,
(SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno) dc2
WHERE e.deptno = dc1.deptno
AND e.mgr = m.empno
AND m.deptno = dc2.deptno;
--WITH 절을 사용하면 동일한 커리를 두번 선언하지 않고 그 이름을 중복해서 참조할 수 있다
WITH dept_count AS (
SELECT deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT e.ename AS employee_name,
dc1.dept_count AS emp_dept_count,
m.ename AS manager_name,
dc2.dept_count AS mgr_dept_count
FROM emp e,
dept_count dc1,
emp m,
dept_count dc2
WHERE e.deptno = dc1.deptno
AND e.mgr = m.empno
AND m.deptno = dc2.deptno;