Oracle/WITH Sub Query

Oracle WITH Clause example

Soul-Learner 2016. 2. 16. 16:01

오라클 SQL에서 WITH 절을 사용하는 예


SQL WITH 절

SQL의 WITH 절은 SQL-99의 표준이며 오라클 9.2부터 지원되고 있다

WITH 절은 인라인 뷰(Inline View)로 처리되므로 WITH 절을 사용하지 않은 인라인 뷰와 비교하여 이해하는 것이 쉬울 것이다

개념을 명확히 하기 위해서 상관관계 서브커리(Correlated Subquery)와도 상호 비교해 가면서 차이점을 확인하는 것이 좋을 것이다


WITH절을 사용하지 않은 인라인

FROM 절에 적용된 서브커리를 Inline-View 라고 하며 동적으로 메모리에 생성된 가상의 테이블처럼 이해하면 된다

인라인 뷰로 정의된 데이터는 바깥 커리에서 사용할 수 있으며 아래의 문장에서는 t1이라는 이름으로 인라인 뷰가 정의되어 있고 바깥 커리에서 t1을 사용하고 있는 경우이다


SELECT e.ename, e.deptno, t1.sal_avg
FROM   emp e,
  (
    SELECT deptno, avg(sal) sal_avg
    FROM   emp
    GROUP BY deptno
  )t1
WHERE  e.deptno = t1.deptno
ORDER BY e.deptno;


위의 문장을 WITH 절을 사용한 인라인 뷰로 변경하여 동일한 작업을 하는 경우는 다음과 같다

WITH dept_sal_avg AS
(
  SELECT deptno, avg(sal) sal_avg
  FROM emp
  GROUP BY deptno
)
SELECT e.ename, e.deptno, t1.sal_avg
FROM emp e, dept_sal_avg t1
WHERE e.deptno=t1.deptno
ORDER BY e.deptno;


2개 이상의 인라인 뷰도 WITH 절을 사용하여 선언하고 사용할 수 있다

WITH dept_sal_avg AS
(
  SELECT deptno, avg(sal) sal_avg
  FROM emp
  GROUP BY deptno
),
same_job_cnt AS
(
  SELECT job, count(*) job_cnt
  FROM emp
  GROUP BY job
)
SELECT e.ename, e.deptno, t1.sal_avg, t2.job_cnt
FROM emp e, dept_sal_avg t1, same_job_cnt t2
WHERE e.deptno=t1.deptno AND e.job=t2.job
ORDER BY e.deptno;