문제
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 사용법
|
해답
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;