• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

SET3_문제4번_Top Competitors 질문입니다.

21.04.16 02:05 작성 조회수 142

3

저는 INNER JOIN 대신 LEFT JOIN으로 쿼리를 짰는데요.

정답은 맞게 나왔으나, 

어떤 경우에 INNER JOIN 대신 LEFT JOIN 으로 했을 경우 문제가 나타나는지에 대해서 여쭙고 싶습니다. (실무에서)

ㅡㅡ

LEFT JOIN 대신 INNER JOIN 을 사용했을 경우 생길 수 있는 문제에 대해서도 함께 말씀해주시면 감사하겠습니다. 

INNER JOIN은 JOIN구문에서 해당 컬럼이 양쪽 테이블에 모두 존재하는 경우만 추출해서

LEFT JOIN을 사용해야 할 경우에, inner join을 사용하면 누락건이 발생할 수 있을 것 같은데요

제가 이해한 것이 맞나요? 이외에 또 어떤 문제가 발생할 수 있는지 궁금합니다. 

ㅡㅡ

SELECT H.hacker_id, H.name

FROM Submissions S

    LEFT JOIN Hackers H ON S.hacker_id =  H.hacker_id

    LEFT JOIN Challenges C ON S.Challenge_id = C.Challenge_id

    LEFT JOIN Difficulty D ON C.difficulty_level = D.difficulty_level

WHERE S.score = D.score

GROUP BY H.hacker_id, H.name

HAVING COUNT(S.submission_id) > 1

ORDER BY COUNT(S.submission_id) DESC, H.hacker_id ASC;

답변 2

·

답변을 작성해보세요.

7

Bro Kim님의 프로필

Bro Kim

2021.07.12

저도 이전 문제 set의 마지막 문제인 New Companies 문제와 이 문제를 보면서 고민해 봤던 부분이라서
이 부분에 대해 저와 같은 고민을 해봤을 다른 누군가에게 도움이 될 수도 있지 않을까 하는 마음에 댓글 남깁니다.

INNER JOIN의 경우, 데이터가 무결하다는 전제하에 사용하기 좋아보여요.

무슨 말이냐 하면,
배송으로 치면 비회원 주문이라는 예외적인 상황을 필터링 하기 위해 LEFT JOIN을 사용하는 것처럼
이 문제를 예로 들면, hackers 테이블에 등록되지 않은 hacker가 문제를 푼다거나,
challenges 테이블에 존재하지 않는 문제가 등록되는 등,
이런 예외 사항까지 잡아주어 그 정보를 가지고 무언가를 하고자 할 때 LEFT JOIN이 필요할 것 같네요.

이전 문제 set의 마지막 문제인 New Companies 문제의 경우,
실제 문제에서 제공해준  Input 예시에서 Senior Manager가 하위의 Manager를 가지고 있지 않는 일종의 누락(?)이 발생했었고,
강사님은 해당 테이블들에서는 이와 같은 예외가 발생할 수도 있다고 판단하여 이를 잡아주기 위해 LEFT JOIN을 본능적으로 꺼내드셨던 것 같았습니다.

하지만, 이번 문제의 경우

1. 해커가 만점을 맞은 문제에 한해 답을 찾는 과정이기에 만약에 누락된 예외 케이스가 있다 해도 굳이 이를 사용할 필요가 없을 뿐더러,

2. 주어진 테이블들과 상황 자체가 '정해진 문제를 해커들이 푸는 것'이기에, 정체를 알 수 없는 해커가 나타난다거나, 문제 테이블에 존재하지 않는 문제를 푸는 상황 같은 예외 상황에서 보다 안전한 테이블이라는 추측이 가능할 것입니다. 그리고 이전의 문제와는 달리 예시 INPUT 자료에서 누락이 발생하지도 않았지요.

이처럼 원하는 정보를 얻기 위해서 예외 상황을 처리할 필요가 있는가? 와
주어진 데이터의 무결성을 신뢰할 수 있는가? 라는 두가지 측면에서 
LEFT JOIN과 INNER JOIN의 사용을 결정할 수 있을거라 생각해 봅니다.

3

안녕하세요 snowballeffect.biz님

문의 주신 부분과 관련하여 INNER JOIN과 LEFT JOIN 이 차이가 나는 경우와 나지 않는 경우에 대해 답변드리도록 하겠습니다.

1. LEFT JOIN과 INNER JOIN의 결과가 같은 경우

위의 두 테이블을 상품 주문 테이블을 기준(FROM)으로 JOIN 한 결과는 아래와 같습니다.

2. LEFT JOIN과 INNER JOIN의 결과가 다른 경우

이번엔 같은 테이블을 기준이 되는 테이블만 바꾸어(유저 정보 테이블 기준) 다시 JOIN 해보겠습니다.

즉, FROM 절에 놓인 기준 테이블의 정보가 JOIN되는 테이블의 정보에 모두 포함되는 경우에는 INNER JOIN과 LEFT JOIN의 결과 차이가 나지 않구요. FROM 절에 놓인 기준 테이블의 정보 중 LEFT JOIN되는 정보에는 포함되지 않는 데이터가 있는 경우에는 INNER JOIN과 LEFT JOIN의 결과 차이가 발생합니다.

말로 풀어서 설명드리는 것보다 직접 데이터를 보면서 확인하시는 게 좋을 것 같아 샘플 데이터 첨부드렸는데요. 혹시 또 궁금하신 지점이 있으시면 다시 질문 주시면 답변 드리도록 하겠습니다.