[프로그래머스/SQL] 오랜 기간 보호한 동물(2) (FETCH)

HMS·2023년 4월 19일
0

https://school.programmers.co.kr/learn/courses/30/lessons/59411?language=oracle


오랜 기간 보호한 동물(2)

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

풀이

ORACLE

FETCH를 사용하면 MYSQL의 LIMIT과 같은 효과를 낼 수 있다.
FETCH는 다음과 같은 방법으로 사용할 수 있다.

FETCH { FIRST | NEXT } { 건수 | 숫자 PERCENT }
{ROW | ROWS}
{ ONLY | WITH TIES }

OFFSET 행의 시작 지점을 지정
FETCH 반환할 행 또는 행의 비율을 지정
ONLY 행의 수 또는 비율을 정확하게 지정한 값만큼 반환

FIRST와 NEXT ROW와 ROWS의 기능 차이는 없다.
1. 결과를 오름차순 정렬 후 상위 2건 출력

ORDER BY 이름 ASC
FETCH FIRST 2 ROWS ONLY;
OR
FETCH FIRST 2 ROWS WITH TIES;

  1. 결과 행 개수를 전체 ROW 개수의 50%로 제한

    FETCH FIRST 50 PERCENT ROWS ONLY;

  2. 2번째 열부터 3건 출력

    OFFSET 2 ROWS FETCH NEXT 3 ROWS ONLY;

ORACLE

SELECT ANIMAL_ID,NAME FROM(
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A
INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.DATETIME - B.DATETIME
)WHERE ROWNUM <= 2

서브쿼리와 JOIN 없는 풀이

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A,ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.DATETIME - B.DATETIME
FETCH NEXT 2 ROWS ONLY

MYSQL

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A
INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.DATETIME - B.DATETIME
LIMIT 2;

profile
안녕하세요

0개의 댓글