해결된 질문
작성
·
285
0
select empno, ename, deptno, sal, avg(sal) over (partition by deptno) dept_avg_sal
, sal - avg(sal) over (partition by deptno) dept_avg_sal_diff
from hr.emp;
위 SQL은 강사님이 작성해주신 코드 입니다.
with
temp_01 as (
select
empno
,ename
,sal as "개인 급여"
,avg(sal) over (partition by deptno) as "평균 급여"
from emp
)
select empno,ename,"개인 급여","평균 급여",abs("평균 급여"-"개인 급여")
from temp_01;
밑에는 제가 답안지를 안보고 먼저 작성한 코드 입니다.
제가 처음에 첫번째 코드처럼 작성을 하려다가
이게 group by 처럼 부하가 좀 큰 작업이라고 생각이되었습니다.
그래서 한번만 사용하고 싶어서 임시테이블을 만들고
그 테이블의 컬럼끼리 계산을 하게 했는데
윈도우 함수를 한번 더 사용하는것과 서브쿼리로 한번만 호출하는 것 중에서
윈도우 함수를 한번 더 호출하는게 더 나은 선택이라면
그 이유가 궁금합니다.
만약에 서브 쿼리를 사용하는데 그 서브 쿼리에 함수를 사용한 컬럼이 있다면
그 컬럼을 호출할때마다 그 함수를 실행해서 그 결과를 가져오나요?
아니면 한번 서브쿼리를 실행하면 그 데이터가 저장되서 값만 가져오나요?
답변 1
1
안녕하십니까,
서브쿼리를 with절 서브쿼리로 가정하고 말씀드리겠습니다.
강의에서 사용한 것과 같이 동일한 analytic 함수를 두번 사용한 SQL보다 With 절로 한번만 사용하는게 더 성능상 효율적입니다. with절로 사용하면 임시로 값이 만들어 지기 때문에 동일한 analytic 함수를 두번 반복할 필요가 없습니다.
제가 강의에서 사용한 SQL은 성능을 고려한 것이 아니라 강의 설명을 보다 쉽게 이해 시켜 드리기 위함입니다.
추가적으로 말씀 드리면 DBMS에 따라 동일한 레벨의 analytic 함수가 두번 반복해서 사용하면 한번만 사용하는 로직으로 자동 변환을 수행할 수도 있습니다.
감사합니다.
강사님 답변 감사합니다 !!