본문 바로가기

Oracle/WITH Clause

Oracle WITH Clause example

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;