강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

donig1225님의 프로필 이미지
donig1225

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

5-6. JOIN 연습 문제 1~2번

JOIN 연습문제2번

해결된 질문

작성

·

89

0

안녕하십니까 선생님,

JOIN을 할때 조건들을 처리해놓고 조인을 하시라고 하셨는데

영상에 나온 답과 같지만 풀이법이 달라서

아래와 같이 작성해도 큰 문제가 없겠죠?

select type1, count(p.type1) as grass_cnt
  from (
    select trainer_id,
           pokemon_id
    from basic.trainer_pokemon
    where 1=1 
    and status != 'Released'
  )  as tp
left join basic.pokemon as p
  on tp.pokemon_id = p.id
where 1=1
  and p.type1 = 'Grass' 
group by type1

답변 2

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

안녕하세요. 지금 데이터에선 동일한 결과가 나올 것 같은데, 만약 status에 다른 value가 있었다면 명시적으로 쓸 것 같아요(강의의 답처럼) 어떤 조건이 아니다!라고 하는 것은 특정 Value가 생기면 데이터가 의도와 달라질 수 있어서 저는 != 보단 명시적으로 특정 조건만 해당하도록 하고 있어요(물론 상황에 따라 !=가 좋은 경우도 있구요. 상황에 따라 다르긴 하네요)

0

안녕하세요, 인프런 AI 인턴입니다.

donig1225님께서 작성해 주신 쿼리는 기본적으로 올바른 형식을 따르고 있습니다. JOIN을 수행할 때 임시 테이블 형태로 필요한 데이터를 미리 필터링하여 조인하라는 것은 일반적인 SQL 최적화 방법 중 하나입니다. 이렇게 함으로써 조인해야 할 데이터의 양을 줄여 성능을 향상시킬 수 있습니다.

다만, 쿼리를 작성할 때 몇 가지 유의사항을 고려할 필요가 있습니다:

쿼리 구조와 최적화:

  1. 임시 테이블: basic.trainer_pokemon에서 조건을 만족하는 데이터만을 필터링한 후 조인합니다. 이를 통해 최적화된 조인을 기대할 수 있습니다.

  2. 필터 조건: status != 'Released' 조건을 사용하여 이미 방출된 포켓몬을 제외하고 처리합니다. 이 부분은 데이터의 양을 줄이며 실질적인 분석을 돕습니다.

  3. WHERE 절 조건: p.type1 = 'Grass'를 사용하여 Grass 타입의 포켓몬만을 선택하고 있으며, 이는 조인 후에 원하는 특정 데이터만 추출하려는 데 적절합니다.

전체적으로 보면, 작성하신 쿼리에서는 Grass 타입의 포켓몬을 포함하는 레코드들을 필터링하고, 그 카운트를 결과로 반환하는 형태입니다.

이해를 돕기 위한 추가 설명:

쿼리 작성의 최적화 여부와 관계 없이, 로직의 결과를 확인하여 사용자의 기대 결과와 일치하는지를 검증하는 것이 매우 중요합니다. 작성하신 방식과 강의에서 제시한 방법은 데이터를 최적화하는 측면에서의 미세한 차이가 있을 수 있으며, 데이터세트의 특성과 작성자의 의도에 따라 다르게 구현될 수 있습니다.

이와 같은 SQL 쿼리는 작성자의 고유한 선택이며, 필요한 경우 성능 테스트를 통해 효율성을 직접 비교해 보는 것도 좋은 방법입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 이에 해당하는 자세한 설명을 Join 문제와 관련하여 살펴볼 수 있는 관련 질문 링크 를 참조하시기 바랍니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

donig1225님의 프로필 이미지
donig1225

작성한 질문수

질문하기