tak's data blog
[SQL] HackerRank - New Companies 본문
출처 :
https://www.hackerrank.com/challenges/the-company/problem?isFullScreen=true
여러 테이블을 조인하는 문제는 기초이면서도 중요한 부분이라고 생각합니다.
이번에는 5개의 테이블을 조인해서 count를 하는 문제를 풀어보도록 하겠습니다.
inner join을 무분별하게 사용해서 코드가 더 길어져 가독성이 떨어지는 코드를 작성했었는데 이번에는 좀 다른 2가지 풀이로 풀어보도록 하겠습니다!
문제:
문제는 각기 다른 5개의 테이블을 외부 키를 통해 조인한 다음 5개 칼럼의 명수를 출력해야 합니다. 정렬 기준은 company의 company_code를 기준으로 오름차순 정렬이고, 중복된 데이터가 존재한다고 합니다.
1. 문제그대로 풀이한 것으로 from절에 join을 추가하면 코드가 길고 복잡해지므로
where절에 조건을 따로 지정하였습니다.
select c.company_code,
c.founder,
count(distinct(l.lead_manager_code)),
count(distinct(s.senior_manager_code)),
count(distinct(m.manager_code)),
count(distinct(e.employee_code))
from company c,
lead_manager l,
senior_manager s,
manager m,
employee e
where c.company_code = l.company_code
and l.lead_manager_code = s.lead_manager_code
and s.senior_manager_code = m.senior_manager_code
and m.manager_code = e.manager_code
group by c.company_code, c.founder
order by c.company_code asc
2. 문제 특성상 meta테이블인 employee테이블이 존재하여 바로 company테이블과 조인해서 사용하였지만
이런 경우는 거의 없다고 생각하기 때문에 위의 방법으로 기초를 다지면 좋을 것 같습니다.
select
c.company_code,
c.founder,
count(distinct(e.lead_manager_code)),
count(distinct(e.senior_manager_code)),
count(distinct(e.manager_code)),
count(distinct(e.employee_code))
from
company c.
employee e
where
c.company_code = e.company_code
group by
c.company_code,
c.founder
order by
c.company_code asc
주로 3개 이상의 테이블을 조인하였을 때는 from절에 inner join을 사용하였지만
작성할 때마다 저조차도 코드가 길어 헷갈리는 경우가 있었습니다.
하지만 위와 같이 where절에 조건으로 한꺼번에 줘버리면 어느정도 해결이 가능하다고 생각합니다.
또한 from절에 서브쿼리를 통해 간소화를 할 수 있고, with문을 통한 새로운 테이블 생성도 좋은 방법이라고 생각합니다.
오늘도 읽어주셔서 감사합니다!!
'SQL' 카테고리의 다른 글
LeetCode 문제풀이 (176, 178, 180, 181, 182, 183) (1) | 2022.06.24 |
---|---|
[SQL] HackerRank - Ollivander's Inventory (0) | 2022.06.05 |
[SQL] HackerRank - Challenges (0) | 2022.03.17 |
[SQL] HackerRank - Contest Leaderboard (1) | 2022.02.12 |
[SQL] HackerRank - The Report (1) | 2022.02.11 |