해결된 질문
작성
·
222
0
제가 작성한 SQL
select * from nw.orders o
where o.order_id in ( select max(order_id)
from nw.orders a
group by a.customer_id );
강사님이 작성한 SQL
select * from nw.orders
where (customer_id, order_date) in (select customer_id, max(order_date)
from nw.orders group by customer_id);
강사님 서브쿼리 강의 추가해주셔서 감사합니다.
제 기억에는 강사님께서 IN 연산자로 사용할 경우 세미 조인처럼 연결된다고 하셨던거 같은데 실행을 해보니까
조건이 하나 일때에는 세미 조인이지만
조건이 2개가 되니까 해쉬 조인으로 바뀌더라구요
그 이유가 궁금합니다.
답변 1
1
안녕하십니까,
서브쿼리는 조인과 비슷한 세미조인으로 내부적으로 수행될 수 있는데, 이게 특정 조건에 따라 완전 조인으로 풀릴 수 있습니다.
(백프로 확실한건 아닌데) 세미조인을 하지 않고 완전 조인으로 풀리는 경우는 서브쿼리가 명확하게 1의 레벨로 될 때 그렇게 될 확률이 높습니다.
가령 select customer_id, max(order_date) from nw.orders group by customer_id) 는 group by 컬럼인 customer_id로 1의 집합이 명확하게 됩니다(그러니까 distinct가 필요 없습니다)
그런데 select max(order_id) from nw.orders a group by a.customer_id 는 max(order_id)가 동일한 값이 나올 수도 있습니다. 그렇게 때문에 완전 해쉬 조인이 아니라 세미 해쉬 조인으로 풀린것 같습니다.
감사합니다.
강사님 정말 감사합니다.. !! 강의 보면서 SQL을 생각하면서 작성하게 되었습니다 !!