레이블이 오라클WITH인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클WITH인 게시물을 표시합니다. 모든 게시물 표시

2020년 7월 19일 일요일

오라클 WITH구문

​

​

5.6 WITH 구문

ORACLE9i R2이후 사용 가능한 WITH구문은 이름이 부여된 서브쿼리 블록으로 global temporary tables, virtual table or an inline view 처럼 작동된다. 복잡한 SQL에서 동일 쿼리블록이 반복적으로 사용되는 경우 그 블록에 이름을 부여하여 한곳에서 정의하고 이를 재사용 할 수 있게 함으로서 쿼리문 코딩량도 줄이고 성능도 향상 시킬 수 있는데, WITH절을 이용하여 미리 이름을 부여해서 Query Block을 만들 수 있다. 자주 실행되는 경우 한번만 Parsing되고 실행 계획이 수립되므로 성능 향상에 도움이 된다.

WITH문은 주로 SELECT 문과 함께 사용 되며 Query Block을 미리 정할 수 있는데 자주 사용되는 QUERY의 블록이 고 비용인 경우 이용하면 성능상 장점이 있다.

-- 인라인 뷰를 이용한 경우

SELECT e.ename,

emps.emp_count

FROM emp e,

(SELECT deptno, COUNT(*) AS emp_count

FROM emp

GROUP BY deptno) emps

WHERE e.deptno = emps.deptno;

-- with문 이용

WITH emps AS (

SELECT deptno, COUNT(*) AS emp_count

FROM emp

GROUP BY deptno

)

SELECT e.ename, emps.emp_count

FROM emp e, emps

WHERE e.deptno = emps.deptno;

-- 인라인뷰를 이용한 경우

SELECT e.ename AS employee_name,

emps1.emp_count ,

m.ename AS manager_name,

emps2.emp_count

FROM emp e,

(SELECT deptno, COUNT(*) AS emp_count

FROM emp

GROUP BY deptno) emps1,

emp m,

(SELECT deptno, COUNT(*) AS emp_count

FROM emp

GROUP BY deptno) emps2

WHERE e.deptno = emps1.deptno

AND e.mgr = m.empno

AND m.deptno = emps2.deptno;

-- WITH문을 이용한 경우

WITH emp_count AS (

SELECT deptno, COUNT(*) AS dept_count

FROM emp

GROUP BY deptno

)

SELECT e.ename,

emps1.dept_count,

m.ename,

emps2.dept_count

FROM emp e,

emp_count emps1,

emp m,

emp_count emps2

WHERE e.deptno = emps1.deptno

AND e.mgr = m.empno

AND m.deptno = emps2.deptno;

--아래의 예문을 보면 WITH에 대해 이해가 될 것이다. 먼저 WITH를 사용하지 않은 예문이다.

-- 64초 소요

select e.empno, e.deptno, e.sal, d.dname from (

select empno, sal, deptno from myemp1 where sal > 5000000

) e, mydept1 d

where e.deptno = d.deptno

and e.deptno = ‘1’

union

select e.empno, e.deptno, e.sal, d.dname from (

select empno, sal, deptno from myemp1 where sal > 5000000

) e, mydept1 d

where e.deptno = d.deptno

and e.deptno = ‘2’

union

select e.empno, e.deptno, e.sal, d.dname from (

select empno, sal, deptno from myemp1 where sal > 5000000

) e, mydept1 d

where e.deptno = d.deptno

and e.deptno = ‘3’

-- WITH구를 사용한 예문

-- 33초 소요

with e as (

select empno, sal, deptno from myemp1 where sal > 5000000

)

select e.empno, e.deptno, e.sal, d.dname from e, mydept1 d

where e.deptno = d.deptno

and e.deptno = ‘1’

union

select e.empno, e.deptno, e.sal, d.dname from e, mydept1 d

where e.deptno = d.deptno

and e.deptno = ‘2’

union

select e.empno, e.deptno, e.sal, d.dname from e, mydept1 d

where e.deptno = d.deptno

and e.deptno = ‘3’

-- INSERT문에서 WITH구가 사용되는 예제

SQL> create table emp20 as select empno, ename from emp where 1 > 100;

테이블이 생성되었습니다.

SQL> INSERT INTO emp20

2 SELECT * FROM (

3 WITH dept20 AS (

4 SELECT empno, ename FROM emp WHERE deptno = 20)

5 SELECT * FROM dept20);

5 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...