• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    해결됨

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

23.06.19 21:07 작성 조회수 160

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

권 철민님의 프로필

권 철민

지식공유자

23.06.20 19:59

안녕하십니까,

서브쿼리는 조인과 비슷한 세미조인으로 내부적으로 수행될 수 있는데, 이게 특정 조건에 따라 완전 조인으로 풀릴 수 있습니다.

(백프로 확실한건 아닌데) 세미조인을 하지 않고 완전 조인으로 풀리는 경우는 서브쿼리가 명확하게 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

질문자

23.06.20 21:57

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