튜닝전 sql 이 보이면 바로 merge 문으로 튜닝해주기
문제 454 dept 에 추가한 sumsal 컬럼의 값을 해당 부서번호의 별 토탈월급으로 갱신하시오
merge into dept d
using (select sum(sal) as sumsal
from emp
group by deptno ) v
on (d.deptno = v.deptno)
when matched then
update set d.sumsal = v.sumsal ;
문제 455 부서번호의 40 번의 sumsal 이 숫자 0으로 갱신되도록 merge 문 작성
merge into dept d
using (select deptno, sum(sal) sumsal
from emp
group by deptno ) v
on (d.deptno = v.deptno(+))
when matched then
update set d.sumsal = nvl(v.sumsal,0) ;
emp 테이블 deptno 에 40 번이 없어서 sumsal 값이 촐력 되지않으므로 출력되도록 하기 위해 모자란 쪽에 outer join 을 (+) 해줘서 v.deptno 가 null 생기게한다. 그후에 v.sumsal 에 nvl 함수를 중첩하여 출력하면 null 인 값이 0으로 치환되어 나타난다.
또는 using 절에 쓰인 쿼리문을 view 로 생성하여 문제를 풀 수도있다. ( 쿼리문이 깔끔해질 수 있으나, 현업에서 view 를 생성하지 못할 수 있다.)
문제 459 telecom_service테이블에 cnt 컬럼을 추가하세요~
alter table telecom_service
add cnt number(10);
문제 460 telecom_service 테이블의 cnt 컬럼의 해당 통신사의 인원수로 값을 갱신하시오
merge into telecom_service t
using (select telecom, count(*) cnt
from emp14
group by telecom)v
on (t.telecom = v.telecom)
when matched then
update set t.cnt = v.cnt ;
문제 464 telecom_service 테이블에 avg_age 컬럼을 추가하고
데이터를 통신사별 평균나이로 값을 갱신하시오.
merge into telecom_servie t
using ( select telecom, avg(age) avg_age
from emp14
group by telecom)v
on ( t.telecom = v. telecom)
when matched then
update set t.avg_age = v.avg_age ;
문제 465 위의 sql 을 악성을 작성해보면? update 절
update telecom_service t
set avg_age = (select round(avg(age))
from emp14 e
where e.telecom = t.telecom);
악성인 이유는 메인쿼리문에 데이터가 많다면 서브쿼리문으로 하나한 일일히 메인쿼리문의 행수만큼 가서 갱신시키기때문에 엄청나게 오래 걸린다.
'Oracle > SQL' 카테고리의 다른 글
SQL Create 로 만들 수 있는 데이터 베이스 오브젝트 (0) | 2021.12.03 |
---|---|
* SQL 계층형 질의문 connect by 절 level 서열을 주어 데이터 출력 (0) | 2021.12.02 |
SQL 서브쿼리를 이용한 DATA 삭제 Delete (0) | 2021.11.30 |
SQL 서브쿼리를 이용한 DATA 수정 Update (update 절에 튜닝시 merge 만큼빠름) (0) | 2021.11.30 |
SQL 서브쿼리를 이용한 DATA 입력 Insert (0) | 2021.11.30 |