작성
·
17
0
안녕하세요.
강의를 들으면서 잘 이해가 되지 않는 부분이 있어 질문 드립니다.
질문 드리고자 하는 부분은 "직원명 SMITH의 과거 소속 부서 정보를 구할 것"이라는 문제의 쿼리문인데요.
우선 제가 작성한 쿼리문은 아래와 같습니다.
selecta.ename, a.empno, b.deptno, c.dname, b.fromdate, b.todate
fromhr.empa
joinhr.emp_dept_histbona.empno = b.empno
joinhr.deptcona.deptno = c.deptno
wherea.ename = 'SMITH';
그리고 강사님께서 작성하신 쿼리문은 아래와 같구요.
selecta.ename, a.empno, b.deptno, c.dname, b.fromdate, b.todate
fromhr.empa
joinhr.emp_dept_histbona.empno = b.empno
joinhr.deptconb.deptno = c.deptno
wherea.ename = 'SMITH';
두 쿼리문의 차이는 join hr.dept c on 부분에서 "a.deptno = c.deptno"과 "b.deptno = c.deptno"입니다.
제 생각에는 위 두 쿼리문이 같은 결과를 뱉어야 할 것 같은데.. 아래 쿼리문 결과를 보면 dname 부분이 다르게 출력됩니다.
1) 제가 작성한 쿼리문 결과
2) 강사님이 작성하신 쿼리문 결과
제 짧은 지식으로는 두 결과가 동일해야 할 것 같은데, 제가 잘못 생각한 부분이 있다면 말씀 부탁드립니다 ㅠ
답변 1
1
안녕하십니까,
이런 경우 수행하신 SQL을 차근 차근 결합해 보시는게 좋습니다.
먼저 emp a 와 emp_dept_hist b 만 조인해서 a의 dept_no와 b의 dept_no를 보시면
selecta.ename, a.empno, a.deptno as a_deptno, b.deptno as b_deptno
fromhr.empa
joinhr.emp_dept_histbona.empno = b.empno
wherea.ename = 'SMITH';
a의 dept_no는 직원의 현재 dept_no입니다. 그리고 b의 dept_no는 과거까지 포함된 dept_no 입니다.
그런데 아래와 같이 emp의 a.dept_no와 dept의 c.deptno를 조인하게 되면 현재 부서의 dept에 대한 정보만 나오게 됩니다. 그러니까, b.fromdate, b.todate는 부서 변경이력이 나오지만, c.dname은 현재 부서명만 나오게 되므로 원하는 결과가 되지 않습니다.
selecta.ename, a.empno, b.deptno, c.dname, b.fromdate, b.todate
fromhr.empa
joinhr.emp_dept_histbona.empno = b.empno
joinhr.deptcona.deptno = c.deptno
wherea.ename = 'SMITH';
그래서 제가 작성한 SQL과 같이 과거 이력의 emp_dept_hist의 deptno와 dept의 deptno를 조인해야 과거 dept에 대한 dname 정보를 가져 올 수 있습니다.
감사합니다.
아.. emp와 emp_dept_hist 테이블의 deptno 컬럼 앞에 "a_", "b_"를 붙여서 비교해보니 빠르고 명확하게 이해가 되네요!
빠른 답변 정말 감사드립니다 ㅎㅎ
머신러닝 PerfectGuide부터 강사님 강의를 수강한 사람으로써, 정말 이해하기 쉽게 잘 설명해주시는 것 같아요!
항상 감사드립니다 :)