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

yannie·2024년 10월 1일
0

[문제]

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

[내가 푼 풀이(오답)]

-- 코드를 입력하세요
-- 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리 => 이름, 보호 시작일
SELECT
    NAME, -- 이름
    DATETIME -- 보호시작일
FROM ANIMAL_INS
WHERE ANIMAL_ID
NOT IN (SELECT DATETIME
   FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3
;

[내가 푼 풀이(정답)]

-- 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리 => 이름, 보호 시작일
SELECT
    NAME, -- 이름
    DATETIME -- 보호시작일
FROM ANIMAL_INS
WHERE ANIMAL_ID
NOT IN (SELECT ANIMAL_ID
   FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3
;
-- 입양을 못 간 = ANIMAL_OUTS에 없는 동물 

[다른 풀이]

SELECT
    I.NAME,
    I.DATETIME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3
;

[코드리뷰]

  • '아직 입양을 못 간' = ANIMAL_OUTS에 없는 동물
  • ANIMAL_INS 테이블을 기준으로 ANIMAL_OUTS에 데이터가 없는 동물들만 추출하여 출력하면 된다.
  • 첫 번째 오답 코드의 경우,
    • 입양 날짜가 없을 것이라고 생각하여 그것에 초점을 맞춰 풀이를 진행하여 오답이 되었다.
  • 두 번째 정답 코드의 경우,
    • 입양 날짜를 기준으로 필터링 한 것이 아니라 OUTS테이블에 ANIMAL_ID가 없다는 것에 초점을 맞춰 정답이 되었다.
  • 세 번째 다른 풀이는,
    • LEFT JOIN을 활용하여 INS테이블과 OUTS테이블을 결합하였고,
      LEFT JOIN의 경우 데이터가 일치하지 않는 부분은 NULL값으로 채워지기 때문에
    • O.ANIMAL_ID가 NULL값인 데이터를 필터링 하였다.

기억해!

  • 또 다른 풀이가 있을까...

0개의 댓글