with 절의 쿼리 결과를 임시테이블로 생성하는것을 subquery factoring 이라고 한다.
from 의 서브쿼리와 with 절의 차이점
- from 절의 서브쿼리 —> 쿼리문의 결과가 memory 에 올라간다.
- with 절의 쿼리 ——> 쿼리문의 결과가 disk 에 저장된다.
memory ? ram 사용 막 서로 날리면 서로 쓰겠다고 경쟁이 일어날 수있다.
disk ?
내가 from 절의 서브쿼리를 써야할지 with 절을 써야할지 고민 된다면
- 데이터가 있는 서버가 oltp 서버인지, dw 서버인지 먼저 알아야한다.
- 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 절에 쓸 수 있게 되었다.
'Oracle > SQL' 카테고리의 다른 글
SQL 알고리즘 ( 구구단 구현하기) (0) | 2021.12.05 |
---|---|
SQL - DCL 문 (0) | 2021.12.05 |
SQL - WITH 절을 이용한 알고리즘 문제 (1) 구구단출력,log, 주사위던지기(랜덤)확률 문제풀기 (0) | 2021.12.05 |
SQL -WITH 절 (가상테이블) (0) | 2021.12.05 |
SQL 제약 (5) Foreign Key (자식키) (0) | 2021.12.05 |