본문 바로가기
Computer/Algorithm_SQL

[Programmers] 조건에 부합하는 중고거래 댓글 조회하기 (Success)

by HJ0216 2023. 9. 17.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM'= '2022-10'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

🙂 확인 사항

1. USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블

2. 2022년 10월에 작성된

3. 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회

4. 댓글 작성일을 기준으로 오름차순 정렬 → 게시글 제목을 기준으로 오름차순 정렬

 

🚨 문자열 비교는 날짜 비교보다 느릴 수 있음

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE EXTRACT(YEAR FROM B.CREATED_DATE) = 2022
     AND EXTRACT(MONTH FROM B.CREATED_DATE) = 10
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

EXTRACT 사용

 

🚨 모든 행을 스캔하여 연도와 월을 추출한 다음 비교하는 형태로 인덱스를 효과적으로 사용하지 못할 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  SELECT B.TITLE, 
         B.BOARD_ID, 
         R.REPLY_ID, 
         R.WRITER_ID, 
         R.CONTENTS, 
         TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') CREATED_DATE
    FROM USED_GOODS_BOARD B 
    JOIN USED_GOODS_REPLY R 
      ON B.BOARD_ID = R.BOARD_ID
   WHERE B.CREATED_DATE >= DATE '2022-10-01'
     AND B.CREATED_DATE < DATE '2022-11-01'
ORDER BY R.CREATED_DATE, B.TITLE
;
 
 

DATE 리터럴을 사용하여 'YYYY-MM-DD' 형식으로 날짜를 직접 지정

 

⭐ DATE 리터럴을 사용한 방법이 일반적으로 가장 효율적

- 가독성이 좋음

- SQL 표준에 가까운 형태

- 범위 기반의 조건을 사용하면 인덱스를 유용하게 활용할 수 있음

 

 

 

🔗 소스 코드
GitHub