강사님 안녕하세요,
조인실습2에서 부서명 SALES와 RESEARCH 소속 직원별로 과거부터 현재까지 모든 급여를 취합한 평균 급여 예시가 조금 헷갈립니다. With 문이 서브쿼리 역할을 하는걸로 이해하고 있는데 해당 예시에서 왜 with문이 왜 필요한지, with문 또는 서브쿼리 사용하지 않고 쿼리를 진행시키는 방법이 있는지 궁금합니다ㅠ
강사님 안녕하세요,
조인실습2에서 부서명 SALES와 RESEARCH 소속 직원별로 과거부터 현재까지 모든 급여를 취합한 평균 급여 예시가 조금 헷갈립니다. With 문이 서브쿼리 역할을 하는걸로 이해하고 있는데 해당 예시에서 왜 with문이 왜 필요한지, with문 또는 서브쿼리 사용하지 않고 쿼리를 진행시키는 방법이 있는지 궁금합니다ㅠ
안녕하십니까,
강의에서도 말씀 드리지만, with절을 사용해서 제가 설명을 드리는 이유는 중요 포인트마다 집합 레벨을 설명드리고, 어떻게 전체 sql이 구성 되는지 차근차근 나눠서 설명드리기 위함입니다.
with절을 사용하지 않고 아래와 같이 인라인 뷰 형태로 적용해도 됩니다. 다만 제가 설명상 집합 레벨로 설명 드리기가 좀 더 복잡해 질 수 있습니다.
select empno, max(ename) as ename, avg(sal) as avg_sal
from
(
select a.dname, b.empno, b.ename, b.job, c.fromdate, c.todate, c.sal
from hr.dept a
join hr.emp b on a.deptno = b.deptno
join hr.emp_salary_hist c on b.empno = c.empno
where a.dname in('SALES', 'RESEARCH')
order by a.dname, b.empno, c.fromdate
) a group by empno;
또한 아래와 같이 인라인 뷰를 사용하지 않아도 최종 집합을 만들 수 있습니다. 하지만 아래 SQL은 중간 집합이 어떻게 만들어지고, 이것들이 어떻게 최종 집합으로 만들어 지는지 설명드리기에 체계적이지 못할 수 있기에 사용하지 않았습니다.
select b.empno, max(b.ename) as ename, avg(c.sal) as avg_sal
from hr.dept a
join hr.emp b on a.deptno = b.deptno
join hr.emp_salary_hist c on b.empno = c.empno
where a.dname in('SALES', 'RESEARCH')
group by b.empno
감사합니다.
답글
감사합니다 강사님. 많은 도움이 되었습니다
답글