OracleDB/OracleDB 코딩테스트 해결과정

프로그래머스 스쿨(Oracle - Lv.3) - 오랜 기간 보호한 동물(1) (OUTER JOIN / FETCH)
깝몬 2023. 6. 15. 09:38

문제

문제부터 길지만 요약 : 입양 못간 동물중 가장 보호시작일이 빠른 동물 3마리 이름과 보호시작일

TROUBLE POINT

가장 오래 있던 3마리 라고 하면 DATE값을 크기순서로 나열 했을때 가장 작은 3개를 출력해야 한다.

그런데 이러한 표현을 아직 배우지 않았다.

 

IDEA

우리는 ANIMAL_INS에는 DATETIME있지만 ANIMAL_OUTS에는 데이터타입이 없는 데이터를 찾고싶으니, 크기가 다른 두 테이블을 합치고 싶다.

 

문제에서 FOREIGN KEY로 ANIMAL_ID를 통해 두 테이블을 합쳐주고, ANIMAL_OUTS테이블의 DATETIME COLUMN이 NULL인 곳을 찾아내겠다.

 

SELECT i.NAME NAME, i.DATETIME DATETIME
FROM ANIMAL_INS i FULL OUTER JOIN ANIMAL_OUTS o on i.ANIMAL_ID=o.ANIMAL_ID
WHERE o.DATETIME is null
order by i.datetime asc;

 

이렇게 되었을때 우리는 조건에 맞는 '모든' 데이터를 가져오게 되었다.

 

이제 우리가 할일은 가장 입양일이 빠른 데이터 3개만 출력하도록 해야한다.

 

※ROWNUM 과 FETCH

두 함수 모두 데이터 전체에서 선택적으로 가져오는 방식이다.

ROWNUM은 ROW의 번호를 통해 ROW의 데이터를 가져온다.
그런데 ROW의 번호는 정렬되기전에 SELECT와 FROM을 하는순간에 정해져있기때문우리가 원하는 데이터가 나오지 않을 가능성이 높다.

FETCH는 결과를 정렬하고 조건을 적용까지 다 하고나서 특정 범위의 ROW를 가져온다.
ROWNUM 과 다르게 우리가 원하는 조건이 적용 된 후 원하는 범위를 가져오기때문에 정확한 데이터를 가져온다.

★FETCH 사용법

  1. FETCH FIRST n ROWS ONLY:
    • 가장 일반적인 FETCH 문법입니다.
    • 결과 집합에서 처음부터 n개의 행을 선택합니다.
    • 예시: FETCH FIRST 5 ROWS ONLY
  2. OFFSET n ROWS FETCH NEXT m ROWS ONLY:
    • 결과 집합에서 n개의 행을 건너뛴 후, 다음 m개의 행을 선택합니다.
    • 예시: OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY
  3. OFFSET n ROWS FETCH FIRST m ROWS ONLY:
    • 결과 집합에서 n개의 행을 건너뛴 후, 처음부터 m개의 행을 선택합니다.
    • 예시: OFFSET 5 ROWS FETCH FIRST 10 ROWS ONLY
  4. OFFSET n ROWS:
    • 결과 집합에서 n개의 행을 건너뛴 후, 나머지 모든 행을 선택합니다.
    • 예시: OFFSET 5 ROWS
  5. FETCH NEXT m ROWS ONLY:
    • 결과 집합에서 다음 m개의 행을 선택합니다.
    • 이전 OFFSET 문 없이 단독으로 사용되면, 결과 집합의 처음부터 m개의 행을 선택합니다.
    • 예시: FETCH NEXT 10 ROWS ONLY
  6. FETCH FIRST ROW ONLY:
    • 결과 집합에서 첫 번째 행만 선택합니다.
    • 예시: FETCH FIRST ROW ONLY


해답

 

SELECT i.NAME NAME, i.DATETIME DATETIME
FROM ANIMAL_INS i FULL OUTER JOIN ANIMAL_OUTS o on i.ANIMAL_ID=o.ANIMAL_ID
WHERE o.DATETIME is null
order by i.datetime asc
fetch first 3 rows only;