programmers.co.kr/learn/courses/30/lessons/59044
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
이렇게 하니까 참 간결하고 좋네...
'SQL' 카테고리의 다른 글
[ORACLE] 프로그래머스 있었는데요 없었습니다 (0) | 2021.03.14 |
---|---|
[ORACLE] 프로그래머스 없어진 기록 찾기 (0) | 2021.03.14 |
[ORACLE] LeetCode Second Highest Salary (0) | 2021.03.13 |
[ORACLE] 프로그래머스 입양 시각 구하기(1) (+MySQL) (0) | 2021.03.11 |
[ORACLE] 프로그래머스 NULL 처리하기(+MySQL) (0) | 2021.03.11 |