본문 바로가기

데이터리안

solvesql / 연습문제 / 복수 국적 메달 수상한 선수 찾기 (Unique Key)

728x90

📚문제

저작권 이슈로 게시 X


📝풀이

# 내 코드 - 오답
SELECT a.name
FROM records r
INNER JOIN athletes a ON r.athlete_id = a.id
INNER JOIN games g ON r.game_id = g.id
INNER JOIN teams t ON r.team_id = t.id
WHERE g.year >= 2000
  AND r.medal IS NOT NULL
GROUP BY a.name
HAVING COUNT(DISTINCT t.team) >= 2
ORDER BY a.name

 

처음에 작성한 코드

근데 제출에서 정답 레코드 개수 1개 차이로 계속 오답이었다

 

혹시나해서 구글링하여 찾아보니 도움이 많이 된

풀이가 있어서 조금 참고하였다

 

출처 : [solvesql] 복수 국적 메달 수상한 선수 찾기 (tistory.com)

 

 

일단 해답은 그룹화(GROUPING)에 있었다

 

왼쪽은 선수 이름 (a.name) 으로 그룹핑하였을 때 ( 내가 한 방식 )

오른쪽은 선수 id(a.id) 로 그룹핑하였을 때

 

왼 : name으로 그룹핑 / 오 : id로 그룹핑

 

name으로 그룹핑 했을때는 'Chen Jing' 선수가 포함되고 

id로 그룹핑 했을때는 'Chen Jing'선수가 빠지게 된다

 

● Chen Jing에 대해 검색

이 사람은 id와 국적이 다른 , 이름만 같은(동명이인의) 사람이다

그래서 이름으로 그룹핑하고 HAVING 조건을 걸면 당연히 

Chen Jing을 같은 사람으로 취급해서 값에 포함이 되는 것이고 ( 이중국적으로 취급  )

 

ID로 그룹핑하고 HAVING 조건을 걸면

id가 다르고 둘은 엄연히 다른 사람이므로 포함이 되지 않는다

 

왜 값이 다르게 조회가 되는지 헷갈렸는데

이렇게 직접 눈으로 보고 이해하고 넘어가니 개운하다..!

 

+ 최종 코드

SELECT a.name
FROM records r
INNER JOIN athletes a ON r.athlete_id = a.id
INNER JOIN games g ON r.game_id = g.id
INNER JOIN teams t ON r.team_id = t.id
WHERE g.year >= 2000
  AND r.medal IS NOT NULL
GROUP BY a.id
HAVING COUNT(DISTINCT t.team) >= 2
ORDER BY a.name

 

728x90