반응형
테이블 정보
1. ANIMAL_INS
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
2. ANIMAL_OUTS
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
예시 테이블
1. ANIMAL_INS
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
A354597 | Cat | 2014-05-02 12:16 | Normal | Ariel | Spayed Female |
A373687 | Dog | 2014-03-20 12:31 | Normal | Rosie | Spayed Female |
A412697 | Dog | 2016-01-03 16:25 | Normal | Jackie | Neutered Male |
A413789 | Dog | 2016-04-19 13:28 | Normal | Benji | Spayed Female |
A414198 | Dog | 2015-01-29 15:01 | Normal | Shelly | Spayed Female |
A368930 | Dog | 2014-06-08 13:20 | Normal | Spayed Female |
2. ANIMAL_OUTS
ANIMAL_ID | ANIMAL_TYPE | DATETIME | NAME | SEX_UPON_OUTCOME |
A354597 | Cat | 2014-05-02 12:16 | Ariel | Spayed Female |
A373687 | Dog | 2014-03-20 12:31 | Rosie | Spayed Female |
A368930 | Dog | 2014-06-13 15:52 | Spayed Female |
문제
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
아이디어
- 우선 보호소에 들어온 일자와 나간 일자가 필요하니 두 테이블을 조인해 주어야 한다.
- LEFT 조인을 통해 ANIMAL_INS와 ANIMAL_OUTS테이블을 결합한다.
- ANIMAL_OUTS의 DATETIME이 NULL인 데이터가 아직 보호소에 있는 동물이다.
- 해당 데이터를 오름차순으로 정렬하고, 상위 3개의 데이터만 뽑아 출력해주면 된다.
정답
1. ORACLE
-- 코드를 입력하세요
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE 1=1
AND B.DATETIME IS NULL
ORDER BY A.DATETIME
FETCH FIRST 3 ROWS ONLY
2. MYSQL
-- 코드를 입력하세요
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE 1=1
AND B.DATETIME IS NULL
ORDER BY A.DATETIME
LIMIT 3
참고사항
- MYSQL에서는 LIMIT 3을 통해 SELECT문을 수행하고 난 뒤 상위 3개 레코드만 출력해 주었다.
- ORACLE에서는 LIMIT을 사용할 수 없고 WHERE절에서 ROWNUM을 사용해 주어야 한다.
- 하지만 ORACLE은 SELECT문을 수행하기 전에 ROWNUM이 먼저 실행되므로 서브쿼리로 관리해 줘야 한다.
- FETCH FIRST N ROWS ONLY를 사용해 주면 MYSQL과 동일하게 SELECT문 수행 후 상위 N개 레코드를 출력할 수 있다.
728x90
반응형
'알고리즘 공부 > SQL' 카테고리의 다른 글
[L4] 프로그래머스 ORACLE 주문량이 많은 아이스크림들 조회하기 (1) | 2024.10.18 |
---|---|
[L4] 프로그래머스 ORACLE 5월 식품들의 총매출 조회하기 (0) | 2024.10.18 |
[L2] 프로그래머스 ORACLE 상품 별 오프라인 매출 구하기 (0) | 2024.10.18 |
[L3] 프로그래머스 ORACLE 보호소에서 중성화한 동물 (0) | 2024.10.18 |
[L3] 프로그래머스 ORACLE 있었는데요 없었습니다 (0) | 2024.10.18 |