Post

없어진 기록 찾기

JOIN

없어진 기록 찾기


문제 설명

다음은 동물 보호소에 들어온 동물의 정보를 담은 ANIMAL_INS 테이블과 동물 보호소에서 입양 보낸 동물의 정보를 담은 ANIMAL_OUTS 테이블입니다.


ANIMAL_INS 테이블

Column nameTypeNullableDescription
ANIMAL_IDVARCHAR(N)FALSE동물의 아이디
ANIMAL_TYPEVARCHAR(N)FALSE동물의 종류
DATETIMEDATETIMEFALSE보호소에 들어온 날짜 및 시간
INTAKE_CONDITIONVARCHAR(N)FALSE보호 당시 동물의 상태
NAMEVARCHAR(N)TRUE동물의 이름
SEX_UPON_INTAKEVARCHAR(N)FALSE보호 당시 동물의 성별 및 중성화 여부


ANIMAL_OUTS 테이블

Column nameTypeNullableDescription
ANIMAL_IDVARCHAR(N)FALSE동물의 아이디
ANIMAL_TYPEVARCHAR(N)FALSE동물의 종류
DATETIMEDATETIMEFALSE보호소에서 입양된 날짜 및 시간
NAMEVARCHAR(N)TRUE동물의 이름
SEX_UPON_OUTCOMEVARCHAR(N)FALSE입양 당시 동물의 성별 및 중성화 여부




문제

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.




풀이 과정
  1. 조건 확인
    • ANIMAL_INS 테이블에 존재하지 않는 ANIMAL_OUTS 테이블ANIMAL_ID를 찾아야함
    • 결과는 ANIMAL_ID 기준으로 오름차순 정렬
  2. 테이블 결합 (JOIN)
    • ANIMAL_OUTS 테이블 기준으로 LEFT JOIN 사용
    • LEFT JOIN 선택 이유: ANIMAL_OUTS 테이블에 존재하지만 ANIMAL_INS 테이블에는 없는 ANIMAL_ID를 찾기 위해 (기준 테이블인 ANIMAL_OUTS 테이블의 모든 데이터를 유지하기 위해서)
  3. NULL 값 필터링
    • WHERE AI.ANIMAL_ID IS NULL 조건을 사용하여 보호소에 들어온 기록이 없는 동물만 선택해야겠군.
      • LEFT JOIN에서 결합되지 않은 데이터는 NULL로 반환되기 때문에 이 조건을 활용
  4. 결과 정렬하기
    • 정렬 기준에 따라 ORDER BY로 결과 정렬
      • ANIMAL_ID 기준으로 정렬 (Default값은 ASC)
  5. 최종 결과 출력
    • SELECT 절에서 보호소에 들어온 기록이 없는 동물의 ID(ANIMAL_ID)이름(NAME) 출력
  • 교훈
    • 조인하고 IS NULL 로 필터링하여 특정 테이블에 존재하지 않는 데이터를 쉽게 추출하는 것.. 자주 쓰이므로… 잊지 말 것… NULL.. 처리…




정답

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    AO.ANIMAL_ID, 
    AO.NAME
FROM 
    ANIMAL_OUTS AO
LEFT JOIN 
    ANIMAL_INS AI
ON 
    AO.ANIMAL_ID = AI.ANIMAL_ID
WHERE 
    AI.ANIMAL_ID IS NULL
ORDER BY 
    AO.ANIMAL_ID ASC;  


Tip

ANIMAL_OUTS에만 존재하는 동물 찾기

  • ANIMAL_OUTS 테이블 기준으로 LEFT JOIN을 사용하여 ANIMAL_INS 테이블을 ANIMAL_ID 기준으로 결합
  • WHERE 조건에 ANIMAL_INS 테이블에 기록이 없는 경우를 필터링 (AI.ANIMAL_ID IS NULL)

SQL Dialect Used: Oracle




개념 확인

  • LEFT JOIN
    • 기준 테이블의 모든 행을 유지하며, 일치하지 않는 경우에도 결과에 포함. 일치하지 않으면 NULL 반환




없어진 기록 찾기

This post is licensed under Park Juyoung by the author.

Trending Tags