해결된 질문
작성
·
31
·
수정됨
0
선생님, 안녕하세요. 강의 잘 듣고 있습니다!
다름이 아니라 3번 문제에서 trainer를 LEFT에 두시고 계산하셨는데, 저는 trainer_pokemon을 LEFT에 두고 계산했더니 오류가 뜹니다.
SELECT COUNT(DISTINCT tp.trainer_id) AS trainer_cnt
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.trainer AS t
ON tp.location = t.hometown
WHERE tp.location = t.hometown
그렇다고, COUNT에 DISTINCT를 없애니
결과값이 3003개로 나옵니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
아경님께서 작성하신 쿼리에서 trainer_pokemon을 LEFT에 두고 JOIN을 하면서 발생한 문제에 대해 공유해주셨습니다. 이를 이해하고 해결하기 위해 몇 가지 중요한 점을 정리해보겠습니다.
LEFT JOIN의 동작 원리 상, trainer_pokemon
테이블을 LEFT에 두고 trainer
테이블의 hometown
과 매칭하려고 할 때, trainer
테이블에 해당 hometown
이 존재하지 않는다면 NULL 값을 반환하게 됩니다. 그러나 WHERE
절에서 tp.location = t.hometown
조건을 사용하시면서, 이러한 NULL 값의 행이 제외됨에 따라 LEFT JOIN의 의미가 약화되었습니다.
ON
절에 두는 것이 일반적입니다. WHERE
절에 동일한 조건을 두시면, 이너 조인과 같은 효과를 줄 수 있습니다. 이는 LEFT JOIN
의 특성을 활용하지 않는 결과를 초래하게 됩니다.ON
절의 조인 조건을 사용하고, 조건을 추가하는 부분에서 내용을 검토해보시는 게 좋습니다.SELECT COUNT(DISTINCT t.id) AS trainer_cnt
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.trainer AS t
ON tp.location = t.hometown
이렇게 하시면, LEFT JOIN의 특성을 유지하면서, 실제로 trainer가 있어야 한다는 조건이 자연스럽게 만들어지며 DISTINCT가 의미 있게 작동할 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 관련 질문을 통해 비슷한 상황을 학습할 수 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아 다시 실행하니 89로 나오네요 !! 죄송합니다 ㅠㅠ