사전캠프에 늦게 등록하는 바람에
그 동안은 진도 따라잡느라 + 떨어진 감 살리느라
SQL코드카타만 하루에 10개 넘게 풀었었다.
이제 본캠프 시작이 얼마 남지 않았고
페이스 조절을 해야 할 시점이라고 느껴서
하루에 2~3개 정도를 매일 푸는 것으로 목표 변경.
SQL 코드카타 71번
LEFT JOIN만 써서 해결할 수 있는 문제인 줄 알았는데,
OFFLINE_SALES 테이블에 3월 데이터가 없어서(...)
문제에서 요구하는 쿼리를 짜려면 union all을 써서 해결해야 했다.
union all은 사전캠프에서 주어진 강의의 범위 밖이었는데,
나중에 본캠프에서 따로 다룰 일이 있을지 모르겠다.
아래는 처음 냈던 오답과 이후 수정해서 낸 정답 쿼리.
select
date_format(n.sales_date,'%Y-%m-%d') SALES_DATE,
n.product_id,
if(n.user_id is null,'NULL',n.user_id) USER_ID,
sum(n.sales_amount+f.sales_amount) SALES_AMOUNT
from ONLINE_SALE n
left join OFFLINE_SALE f on n.product_id = f.product_id
where date_format(n.sales_date, '%Y-%m') = '2022-03'
group by 1,2,3
select date_format(sales_date,'%Y-%m-%d'),
product_id,
user_id,
sales_amount
from ONLINE_SALE ons
where sales_date like '2022-03%'
union all
select date_format(sales_date,'%Y-%m-%d'),
product_id,
'null',
sales_amount
from OFFLINE_SALE ofs
where sales_date like '2022-03%'
order by 1, 2, 3
SQL 코드카타 72번
복잡할 것 없는 left join 활용 문제.
다만 사전캠프 강의 내용을 떠올리면서
구조를 차분하게 생각해 보면,
reply가 없는 게시물(board)은 있을 수 있어도
게시물이 없는 reply는 있을 수 없다.
(reply는 게시물에 종속되어 있으므로)
따라서,
from a left join b 에서
a에 오는 것은 reply 테이블이어야 한다.
(게시물 테이블이 a 자리에 오면 게시물 테이블 데이터를 다 불러오기 때문에 reply가 없는 애들도 딸려옴)
join 구문을 쓸 때 기준이 되는 a 테이블을
뭘로 할지 직관으로 때려맞추는 경우가 종종 있는데,
오류의 가능성이 높기 때문에 사실 좋은 방법이 아니다.
데이터끼리 어떻게 연결되어 있고,
어떤 테이블을 기준으로 불러와야 문제에서 요구하는 조건에 부합하는 데이터들을 누락 없이 (혹은 매칭되지 않는 데이터들이 의미없이 남지 않게) 불러올 수 있을지
구조를 먼저 보고 문제를 푸는 습관을 들일 것.
오늘의 TIL은 여기까지.