프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 자체는 어렵지 않은데 여러 버전으로 풀어본 기록! (이라서 숨김처리 안함)
1. 가장 처음에 생각나는 기본 풀이법 - Group By와 Having으로 조건 넣기
SELECT B.BOOK_ID AS BOOK_ID
, A.AUTHOR_NAME AS AUTHOR_NAME
, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK B
JOIN AUTHOR A
ON (B.AUTHOR_ID = A.AUTHOR_ID)
GROUP BY CATEGORY, BOOK_ID
HAVING CATEGORY = '경제'
ORDER BY PUBLISHED_DATE
;
👉 업무 하면서 '모든 데이터를 조인시키면 성능이 떨어진다'는 말을 많이 들었기에, 지금과 같이 전체 데이터를 모두 조인하지말고 좀더 나은 방법이 없을까 생각하게 됐다. 모든 데이터 조인 & 그룹을 두개나 & 거기서 경제로 걸러지는 상황.
2. where조건을 쓴다면?
SELECT B.BOOK_ID AS BOOK_ID
, A.AUTHOR_NAME AS AUTHOR_NAME
, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK B
JOIN AUTHOR A
ON (B.AUTHOR_ID = A.AUTHOR_ID)
WHERE CATEGORY = '경제'
GROUP BY CATEGORY, BOOK_ID
ORDER BY PUBLISHED_DATE
;
👉 HAVING조건은 사라졌지만 순서상 조인 다음에 WHERE이 들어가므로 여전히 전체데이터를 모두 조인시킨다는 문제
가 남아있다.
3. 해당하는 데이터만 조인처리 한다면?
SELECT B.BOOK_ID AS BOOK_ID
, A.AUTHOR_NAME AS AUTHOR_NAME
, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK B
JOIN AUTHOR A
ON (B.AUTHOR_ID = A.AUTHOR_ID AND B.CATEGORY= '경제')
GROUP BY CATEGORY, BOOK_ID
ORDER BY PUBLISHED_DATE
👉 조인 조건을 추가해서 '경제' 카테고리만 처리했지만 조건이 눈에 잘 띄지않는다는 단점아닌 단점(?)이 있기도 하다.
개인적으로는 제일 간단하면서도 깔끔하다고 생각.
4. CTE를 활용한다면?
WITH CTE AS (
SELECT BOOK_ID
, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
, AUTHOR_ID
, CATEGORY
FROM BOOK
WHERE CATEGORY = '경제'
) SELECT CTE.BOOK_ID AS BOOK_ID
, A.AUTHOR_NAME AS AUTHOR_NAME
, CTE.PUBLISHED_DATE AS PUBLISHED_DATE
FROM CTE
JOIN AUTHOR A
ON (CTE.AUTHOR_ID = A.AUTHOR_ID)
GROUP BY CATEGORY, BOOK_ID
ORDER BY PUBLISHED_DATE
👉변환작업하면서 오라클과의 성능차이로😂어쩔수 없이 CTE가 필요한 순간들이 있는데, 이렇게 하면 WHERE조건으로 데이터를 거르면서 조인도 처리할 수 있어서 써봤다. 하지만 CTE자체가 성능에 베스트는 아니라서 이 방법이 효율적이라고 할 수 있을지는 모르겠다. 언제 한번 더미데이터로 실행계획도 확인해봐야겠다.
이제 출근준비 고고! 🏃♀️🏃♀️🏃♀️
'🔥 Vamos > ALGORITHM' 카테고리의 다른 글
[프로그래머스/SQL] Lv4_년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.05.03 |
---|---|
[프로그래머스/SQL] Lv2_DATETIME에서 DATE로 형 변환 (0) | 2024.05.02 |
[프로그래머스/SQL] Lv2_카테고리별 상품 개수 구하기 (0) | 2024.05.02 |
[프로그래머스/Java] Lv0_문자 반복 출력하기 (repeat(int n)) (1) | 2023.12.08 |
[프로그래머스/Java] Lv0_모음제거 (2) | 2023.12.07 |