본문 바로가기

Oracle/SQL

SQL - WITH 절 사용 서브쿼리 Factoring

with 절의 쿼리 결과를 임시테이블로 생성하는것을 subquery  factoring 이라고 한다. 

from 의 서브쿼리와 with 절의 차이점

  1. from 절의 서브쿼리 —> 쿼리문의 결과가 memory 에 올라간다.
  2. with 절의 쿼리 ——> 쿼리문의 결과가 disk 에 저장된다.

memory ? ram 사용 막 서로 날리면 서로 쓰겠다고 경쟁이 일어날 수있다.

disk ?

내가 from 절의 서브쿼리를 써야할지 with 절을 써야할지 고민 된다면

  1. 데이터가 있는 서버가 oltp 서버인지, dw 서버인지 먼저 알아야한다.
  2. from 절 안에 쿼리문의 결과 데이터가 대용량 데이터 이면 메모리에 올라가면 부담이기 때문에 with 절을 사용해서 disk 에 저장되서 실행 할수 있도록 하는게 바람직하다.

subquery factoring : with 절의 쿼리의 결과를 임시테이블로 생성하는것

예제 deptno 별 토탈월급을 출력하는데, job 별 토탈월급의 +3000 초과 의 토탈월급을 출력하세요 

불가능한 SQL : 

select deptno, sum(sal)
from (select job, sum(sal) 토탈
       from emp
       group by job  
      ) as job_sumsal
         (select deptno, sum(sal) 토탈
          from emp
           group by deptno
           having sum(sal) > (select avg(토탈) +3000
                               from job_sumsal)
           ) deptno_sumsal
      ;

불가능한 이유 
1. FROM 절의 서브쿼리로는 job_sumsal 의 결과를 참조하여 deptno 의 토탈월급의 조건절로 사용할 수 없다. 

가능하게 하려면 with 절을 하용해서, job_sumsal 의 결과를 disk 에 올려놓게 되면 임시 저장영역에 임시 테이블을 생성하게 되므로 
deptno 의 having 절에 참조가 가능하게 된다.  

with job_sumsal as( select job, sum(sal) 토탈
                      from emp
                      group by job),
     deptno_sumsal as ( select deptno, sum(sal) 토탈
                        from demp
                        group by deptno
                         having sum(sal) > ( select avg(토탈) + 3000
                                              from job_sumsal)
                       )

select deptno, 토탈
from deptno_sumsal ; 

-> 이런식으로 with 절을 사용하여서 deptno_sumsal 테이블이 job_sumsal 의 값을 참조하여서 having 절에 쓸 수 있게 되었다.