• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    해결됨

강사님 조건에 하나일때와 두개 일때가 차이가 있더라구요

23.06.19 21:07 작성 조회수 182

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)가 동일한 값이 나올 수도 있습니다. 그렇게 때문에 완전 해쉬 조인이 아니라 세미 해쉬 조인으로 풀린것 같습니다.

감사합니다.

 

cjh님의 프로필

cjh

질문자

2023.06.20

강사님 정말 감사합니다.. !! 강의 보면서 SQL을 생각하면서 작성하게 되었습니다 !!