oracle 9i 이상에서 지원됩니다.
제가 써본 경험으로는 속도뿐만이 아니라 sql 자체도 많이 간결해졌습니다.
특히 union에 똑같은 문장이 계속 들어갈 경우 사용하면 한번만 기술하고 불러쓰면 됩니다.
문장이 많이 간결해지겠죠?
//기본With문에서 , alias as 로 연결하여 쓰면 된다.
with A as (
....
) ,
B as (
....
)
select ..
..
from (
select * from A
),
(
select * from B
)
-----
in-line view or temporary table에서 “with”구 사용
복잡한 SQL에서 동일 블록에 대해 반복적으로 사용하는 경우 그 블록을 재사용 할 수 있게 함으로서 성능향상을 높일 수 있는데 with절을 이용하여 미리 Query Block을 만들 수 있습니다. with에 의해 만들어 지는 것은 메모리에 존재하는 가상 테이블 정도로 보시면 될 겁니다.
아래의 예를 통해 이해 하도록 합니다.
SQL> -- 아래는 전체 사원 급여의 30% 이상을 차지하는 부서와
SQL> -- 그 부서의 급여의 합을 출력 합니다.
SQL> select
2 dname,
3 sum(sal)
4 from emp natural join dept
5 group by dname
6 having sum(sal) > (select sum(sal) * 0.3 from emp)
7 ;
DNAME SUM(SAL)
-------------- ----------
ACCOUNTING 8750
RESEARCH 10875
SALES 9400
SQL> -- 아래는 같은 결과를 나타내는 동일한 SQL 문장 입니다.
SQL>
SQL> with total_sal as (
2 select dname dname,
3 sum(sal) mysal
4 from emp natural join dept
5 group by dname
6 )
7 select dname, mysal
8 from total_sal
9 where mysal > (select sum(sal) * 0.3 from emp);
DNAME MYSAL
-------------- ----------
ACCOUNTING 8750
RESEARCH 10875
SALES 9400
---
union을 이용하여 데이터를 가지고 오는 경우 Query가 조건절등에서
반복되는 경우가 있습니다.
이를 with로 빼냈을때와 안빼냈을때는 속도의 많은 차이가 있습니다.
'DataBase > Oracle' 카테고리의 다른 글
작업 진행율 (0) | 2008.08.08 |
---|---|
[펌]XMLTYPE 기본 사용 예 (0) | 2008.08.08 |
SQL*LOADER에서 SEQUENCE함수와 DECODE함수 사용하는 방법 (0) | 2008.08.08 |
SQL*Loader에 사용되는 파일들 (0) | 2008.08.08 |
SQL*Loader란? (0) | 2008.08.08 |