ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
문제에서 요구하는 조건을 찾기 위해서는 ANIMAL_INS 테이블에 있는 보호 시작일이 필요하고 동물이 입양을 가지 않았다는 것을 확인해야한다.
그러려면 ANIMAL_INS와 ANIMAL_OUTS가 공유하고 있는 ANIMAL_ID로 두 테이블을 합치고 입양일이 없는 동물을 조회해야한다. 그런데 ANIMAL_INS는 보호소에 있던 모든 동물을 담고있지만 ANIMAL_OUTS는 입양을 간 동물만 담고있기 때문에 두 테이블을 그대로 붙인다면 입양 가지 않은 동물은 ANIMAL_OUTS의 칸이 NULL인 상태일 것이다. 이렇게 일치할 수 없는 테이블을 붙일 때 OUTER JOIN을 사용한다. 그러면 ANIMAL_INS에는 있지만 ANIMAL_OUTS에는 없는 정보를 NULL로 표시한다. 입양을 가지 않은 동물을 입양일이 비어있다는 조건으로 분류해주고 보호시작일을 오름차순으로 정렬해준다면 입양을 가지 않은 동물을 가장 오래 보호소에 있는 동물 순으로 정렬될 것이다. 문제에서는 가장 오래된 동물 3마리만 조회하라고 요구했기 때문에 LIMIT를 써서 3마리만 나오게 해주면 정답을 구할 수 있다.
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
LEFT OUTER JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME
LIMIT 3;