최대 1 분 소요

문제 링크

정답

-- ANIMAL_INS:  ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE
-- ANIMAL_OUTS: ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS AS O
LEFT JOIN ANIMAL_INS AS I
    ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY 1, 2;

✅ Point

  • I 에는 없고, O 에만 있는 정보 => Left JOIN + NULL 로 접근

다른 풀이

  • NOT EXISTS 를 이용한 풀이
    • OUTER JOIN + IS NULLNOT EXISTS의 성능은 거의 비슷
    • NOT EXISTS 은 “부재”의 의미를 명확히 표현한다는 장점 존재
-- ANIMAL_INS:  ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE
-- ANIMAL_OUTS: ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS AS O
WHERE NOT EXISTS (
    SELECT 1
    FROM ANIMAL_INS AS I
    WHERE I.ANIMAL_ID = O.ANIMAL_ID
)
ORDER BY 1, 2;
  • SELECT 1은 “해당 행이 존재하는지만 확인”할 때 쓰는 표현 (정확한 값을 알 필욘 없고 그저 존재 여부만 확인할 때…)