Skip to main content

[SQL] 59045 보호소에서 중성화한 동물

https://school.programmers.co.kr/learn/courses/30/lessons/59045

image.png

image.png

image.png

image.png

1. 문제

테이블

  • ANIMAL_INS : 동물이 보호소에 들어올 때 정보 (ANIMAL_ID, ANIMAL_TYPE, SEX_UPON_INTAKE 등)
  • ANIMAL_OUTS: 동물이 보호소에서 나갈 때 정보(ANIMAL_ID, ANIMAL_TYPE, SEX_UPON_OUTCOME| 등)
  • 두 테이블은 ANIMAL_ID 로 연결됨

조건

  • 보호소에 들어올 때(SEX_UPON_INTAKE) Intact (중성화 안 됨)
  • 보호소에서 나갈 때(SEX_UPON_OUTCOME) Spayed 또는 Neutered (중성화 됨)

출력

  • ANIMAL_ID, ANIMAL_TYPE, NAME

2. 정답쿼리

-- 코드를 입력하세요
-- 들어때는 중성화 X
-- 나갈때는 중성화 O
-- ANIMAL_INS에서는 SEX_UPON_INTAKE 컬럼 에서 Intact 들어간 애들만 CTE
-- CTE를 ANIMAL_ID 기준으로 ANIMAL_OUTS 랑 조회해서
-- SEX_SEX_UPON_INTAKE가 Intact 가 아닌 애들 조회
WITH INTACTS AS (
    SELECT ANIMAL_ID
    FROM ANIMAL_INS
    WHERE SEX_UPON_INTAKE LIKE 'Intact%'
)
SELECT o.ANIMAL_ID, o.ANIMAL_TYPE, o.NAME
FROM ANIMAL_OUTS o JOIN INTACTS i ON o.ANIMAL_ID = i.ANIMAL_ID
WHERE SEX_UPON_OUTCOME LIKE 'Spayed%' 
      OR SEX_UPON_OUTCOME LIKE 'Neutered%'
  • Intact - 중성화 안됨
  • Neutered, Spayed는 중성화됨

★ 핵심 포인트

  • ANIMAL_INS 테이블에서 SEX_UPON_INTAKE 컬럼이 INTACT로 시작하는 동물들의 ID만 조회하기 → CTE
    • 이 때 WHERE쩔에 LIKE 'Intact%'를 쓴다
    • 처음에 LIKE 대신 = 연산자 써서 오답처리 됨
  • 메인 쿼리
    • CTE와 ANIAML_OUTS 테이블을 ANIMAL_ID 컬럼 기준으로 JOIN 하기
    • LIKE 'Spayed%' OR LIKE 'Neutered%' 로 입양보내졌을 때 중성화가 된 동물 조회하기
    • 조회할 컬럼: ANIMAL_ID, ANIMAL_TYPE, NAME
    • 정렬은 따로 문제에 명시되지 않아서 WHERE 절까지만 쿼리 씀