본문 바로가기
개발/database

[Oracle] programmers - 오랜 기간 보호한 동물(1)

by ujin2021 2021. 8. 5.

문제 : https://programmers.co.kr/learn/courses/30/lessons/59044

 

코딩테스트 연습 - 오랜 기간 보호한 동물(1)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

ANIMAL_INS 테이블에는 있지만 ANIMAL_OUTS 에 없는 동물 중 보호기간이 가장 오래된 동물의 TOP 3를 오래된 순으로 조회하는 문제이다.

TOP 3 를 조회하는 두가지 방법을 소개한다!

 

첫번째 방법 - LEFT JOIN + 서브쿼리

SELECT NAME, DATETIME
FROM (SELECT A.NAME, A.DATETIME
      FROM ANIMAL_INS A, ANIMAL_OUTS B
      WHERE A.ANIMAL_ID = B.ANIMAL_ID(+)
      AND B.ANIMAL_ID IS NULL
      ORDER BY A.DATETIME)
WHERE ROWNUM < 4;

ANIMAL_INS를 기준으로 LEFT JOIN 한다 (B.ANIMAL_ID (+) 가 A를 기준으로 LEFT OUTER JOIN 한다는 뜻)

TOP 3만 출력하기 위해 ROWNUM < 4를 WHERE절에 써줘야 하기때문에 FROM 에 서브쿼리를 넣어 미리 DATETIME으로 ORDER 한 튜플들을 SELECT 한 후에 그 중 3개만 다시 SELECT 한다

 

두번째 방법 - FETCH 이용하기

SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID(+)
AND B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
FETCH FIRST 3 ROWS ONLY;

다른 조건절은 위와 같지만, 여기서는 WHERE 절 안에 쓰는 것이 아니라 FETCH FIRST 3 ROWS ONLY를 사용해 TOP 3 를 뽑는다.

 

참고 : https://funfunit.tistory.com/192