문제 링크 : https://velog.io/@yooha9621/SQLP실기문제-선분이력60번
문제 출처 : SQLP 자격검정 핵심노트1 P.175
SELECT P.장비번호 , P.장비명 , P.최종상태코드 , H.상태코드 AS 직전상태코드
, TO_CHAR(P.최종상태변경일시,'YYYYMMDD') AS 최종상태변경일자
, TO_CHAR(H.유효시작일시,'YYYYMMDD') AS 직전변경일자
FROM 장비 P , 상태변경이력 H
WHERE P.장비구분코드 = 'A001'
AND H.장비번호 = P.장비번호
AND H.유효시작일시 < P.최종상태변경일시
AND H.유효종료일시 >= P.최종상태변경일시 - 1/(60*60*24) --최종상태변경일시 1초전 보다는 크다.
ORDER BY P.장비번호
🍎 정리
- 장비구분코드가 'A0001' 인 장비 데이터를 드라이빙 테이블로 놓고 장비번호로 상태변경이력 테이블과 조인하는데 조인하는 데이터의 유효시작일시가 최종 상태 변경일시'보다' 작으면서 유효종료일자가 가장 최근인 데이터를 NL조인한다.
- 이 때 유효종료일자가 가장 최근인 데이터를 구하기 위해
H.유효종료일시 >= P.최종상태변경일시 - 1/(606024) 조건절을 사용했다.
🍎 헷갈렸던 점
- 해당 쿼리를 두번째 쿼리로 바꿀 수 있어야 했다.
SELECT * FROM (SELECT 상태코드 , 유효종료일시 FROM 상태변경이력 AND 장비번호 = P.장비번호 AND P.최종상태변경일자 > 유효종료일자 ORDER BY 유효종료일자 DESC ) WHERE ROWNUM <= 1
- 이 쿼리로 !!
SELECT 상태코드 , 유효종료일시 FROM 상태변경이력 AND 장비번호 = P.장비번호 AND 유효시작일시 < P.최종상태변경일시 AND 유효종료일시 >= P.최종상태변경일시 - 1/(60*60*24) --최종상태변경일시 1분전보다는 크다.