해결된 질문
작성
·
187
0
안녕하세요, 강의 너무 잘 듣고 있습니다.
서브 쿼리 실습 -02 강의 5:57에 나오는 부분에서 하나 궁금한 점이 있어서 문의드립니다.
select * from hr.emp_hist_01 a where todate =
(select max(todate) from hr.emp_hist_01 x where x.empno = a.empno);
위 쿼리에서 서브쿼리가 9999-12-31로 단일 값이 나올 것으로 생각했는데,
아래 테이블 12행에 보면 1983-12-24 데이터도 있어서요.
서브쿼리에 group by empno
가 없는데 어떻게 각 empno별 max(todate)
값을 가져오는지 궁금합니다.
group by empno
가 없으면 그냥 x.empno = a.empno로 조인을 한 뒤 전체 데이터에서 max(todate)값을 가져오는 걸로 이해했는데 아닌 걸까요?
감사합니다.
답변 1
1
안녕하십니까,
적어 주신대로 각 empno별 max(to_date)를 가져오기 때문에 1983-12-24 가 나오게 됩니다.
empno별 max(to_date)를 가져 올 수 있는 이유는 서브 쿼리내의 where x.empno = a.empno
로 메인쿼리와 연결이 되기 때문입니다. 그러니까 메인 쿼리 집합의 레코드 한건씩 서브 쿼리 연결 조건인
where x.empno = a.empno 로
로 서브쿼리와 연결하면서 empno 별 max(to_date)를 계산해 내기 때문입니다.
그러니까 메인 쿼리의 empno 7369 가 서브쿼리의 empno 7369와 연결되어 여러개의 레코드가 있더라도 max(to_date)를 하면 한건 max to_date로 만들어 지게 되므로 별도의 group by 는 필요하지 않습니다. 물론 group by empno를 하셔도 결과는 동일합니다.
감사합니다.