알고리즘 공부/SQL

[L3] 프로그래머스 ORACLE, MYSQL 오랜 기간 보호한 동물(1)

마달랭 2024. 10. 18. 17:14
반응형

테이블 정보

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문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

 

 

아이디어

  1. 우선 보호소에 들어온 일자와 나간 일자가 필요하니 두 테이블을 조인해 주어야 한다.
  2. LEFT 조인을 통해 ANIMAL_INS와 ANIMAL_OUTS테이블을 결합한다.
  3. ANIMAL_OUTS의 DATETIME이 NULL인 데이터가 아직 보호소에 있는 동물이다.
  4. 해당 데이터를 오름차순으로 정렬하고, 상위 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

 

참고사항

  1. MYSQL에서는 LIMIT 3을 통해 SELECT문을 수행하고 난 뒤 상위 3개 레코드만 출력해 주었다.
  2. ORACLE에서는 LIMIT을 사용할 수 없고 WHERE절에서 ROWNUM을 사용해 주어야 한다.
  3. 하지만 ORACLE은 SELECT문을 수행하기 전에 ROWNUM이 먼저 실행되므로 서브쿼리로 관리해 줘야 한다.
  4. FETCH FIRST N ROWS ONLY를 사용해 주면 MYSQL과 동일하게 SELECT문 수행 후 상위 N개 레코드를 출력할 수 있다.

 

728x90
반응형