[SQL] 연습

[solvesql] 복수 국적 메달 수상한 선수 찾기

Simon Yoon 2022. 10. 9. 23:44

Q. 2000년 이후의 메달 수상 기록만 고려했을 때, 메달을 수상한 올림픽 참가 선수 중 2개 이상의 국적으로 메달을 수상한 기록이 있는 선수의 이름을 조회하는 쿼리를 작성해주세요. 조회된 선수의 이름은 오름차순으로 정렬되어 있어야 합니다.

 

- 문제 조건 확인

1. 2000년 이후의 올림픽 게임 기록만 사용

    → where year >= 2000

2. 메달을 수상한 올림픽 참가 선수의 국적이 2개 이상

    → where medal not null 사용 및 group by + count(distinct ~ ) 문 필요 예상

3. 조회된 선수의 이름은 오름차순 정렬

    → order by name

 

- 테이블 확인

하이라이트는 pk

- 풀이과정

1. records 테이블과 games 테이블을 조인, where 절 조건 추가

select athlete_id, team_id
from records
  inner join
    (select id, year
    from games) as g
  on records.game_id = g.id
where medal not null and year >= 2000
limit 1000
;

1. 실행 결과 일부

2. group by와 count(distinct ~ )로 선수별 국적 수 확인

select athlete_id, count(distinct team_id) cnt
from records
  inner join
    (select id, year
    from games) as g
  on records.game_id = g.id
where medal not null and year >= 2000
group by athlete_id
limit 1000
;

2. 실행 결과 일부

3. having 조건 추가, athletes 테이블 조인

select name, count(distinct team_id) cnt
from records
  inner join
    (select id, year
    from games) as g
  on records.game_id = g.id
  inner join
    (select *
    from athletes) as a
  on records.athlete_id = a.id
where year >= 2000 and medal not null
group by athlete_id
having cnt > 1
;

3. 실행 결과 일부


A. 최종 답안

select name
from records
  inner join
    (select id, year
    from games) as g
  on records.game_id = g.id
  inner join
    (select *
    from athletes) as a
  on records.athlete_id = a.id
where year >= 2000 and medal not null
group by athlete_id
having count(distinct team_id) > 1
order by name
;

 

최종 실행 결과 일부