[ORACLE] 프로그래머스 오랜 기간 보호한 동물(1) (+MySQL)
2021. 3. 14.
반응형

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

 

1. 서론

 

약간 난이도가 있다. rownum의 특성을 잘 알아야 하는 문제?

 

2. 문제 풀이

 

ANIMAL_INS: 동물 보호소에 들어온 동물의 정보를 담은 테이블

테이블 구조

ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE

(각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부)

 

ANIMAL_OUTS: 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

테이블 구조:

ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME

(각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부)

 

Q. 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

 

아직 입양을 못 간 동물 => ins에는 있고 outs에는 없는 동물

가장 오래 => datetime이 작은 순서

동물 3마리만 => rownum

 

이 문제의 포인트는 rownum을 써서 조회 결과물 중에 3가지만 출력해야 하는 부분이다.

그런데 결과는 보호 시작일 순으로 조회해야 하기 때문에 order by로 정렬을 해야 한다.

하지만 order by와 rownum을 그냥 같이 쓰게 되면 정렬 때문에 row의 순서가 바뀌게 돼서 그냥 한 쿼리에 적으면 안 된다.

서브 쿼리를 이용해야 한다.

 

3. 코드 설명

 

SELECT name, datetime
FROM(
    SELECT name, datetime
    FROM animal_ins
    WHERE animal_id not in (select animal_id from animal_outs)
    ORDER BY datetime)
WHERE rownum <= 3;

 

from에서 서브 쿼리를 작성하고 이 중에서 rownum중 상위 3개의 값만 출력한다.

이 서브쿼리 안에는 테이블 간의 비교를 하기 위해 join을 했다.

ins 테이블에는 있고 outs 테이블에는 없는 animal_id를 찾는 것이 아직 입양 못 간 동물을 찾는 것과 동일하다.

 

+MySQL

 

SELECT name, datetime
FROM animal_ins
WHERE animal_id not in(select animal_id from animal_outs)
ORDER BY datetime
LIMIT 3

 

이렇게 하니까 참 간결하고 좋네...

 

 

반응형
myoskin