없어진 기록 찾기
JOIN
없어진 기록 찾기
문제 설명
다음은 동물 보호소에 들어온 동물의 정보를 담은 ANIMAL_INS 테이블과 동물 보호소에서 입양 보낸 동물의 정보를 담은 ANIMAL_OUTS 테이블입니다.
ANIMAL_INS 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE | 동물의 아이디 |
ANIMAL_TYPE | VARCHAR(N) | FALSE | 동물의 종류 |
DATETIME | DATETIME | FALSE | 보호소에 들어온 날짜 및 시간 |
INTAKE_CONDITION | VARCHAR(N) | FALSE | 보호 당시 동물의 상태 |
NAME | VARCHAR(N) | TRUE | 동물의 이름 |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE | 보호 당시 동물의 성별 및 중성화 여부 |
ANIMAL_OUTS 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE | 동물의 아이디 |
ANIMAL_TYPE | VARCHAR(N) | FALSE | 동물의 종류 |
DATETIME | DATETIME | FALSE | 보호소에서 입양된 날짜 및 시간 |
NAME | VARCHAR(N) | TRUE | 동물의 이름 |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE | 입양 당시 동물의 성별 및 중성화 여부 |
문제
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
풀이 과정
- 조건 확인
- ANIMAL_INS 테이블에 존재하지 않는 ANIMAL_OUTS 테이블의
ANIMAL_ID
를 찾아야함 - 결과는 ANIMAL_ID 기준으로 오름차순 정렬
- ANIMAL_INS 테이블에 존재하지 않는 ANIMAL_OUTS 테이블의
- 테이블 결합 (JOIN)
- ANIMAL_OUTS 테이블 기준으로 LEFT JOIN 사용
- LEFT JOIN 선택 이유: ANIMAL_OUTS 테이블에 존재하지만 ANIMAL_INS 테이블에는 없는
ANIMAL_ID
를 찾기 위해 (기준 테이블인 ANIMAL_OUTS 테이블의 모든 데이터를 유지하기 위해서)
- NULL 값 필터링
- WHERE AI.
ANIMAL_ID
IS NULL 조건을 사용하여 보호소에 들어온 기록이 없는 동물만 선택해야겠군.- LEFT JOIN에서 결합되지 않은 데이터는 NULL로 반환되기 때문에 이 조건을 활용
- WHERE AI.
- 결과 정렬하기
- 정렬 기준에 따라 ORDER BY로 결과 정렬
ANIMAL_ID
기준으로 정렬 (Default값은 ASC)
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 최종 결과 출력
- SELECT 절에서 보호소에 들어온 기록이 없는 동물의 ID(
ANIMAL_ID
)와 이름(NAME
) 출력
- SELECT 절에서 보호소에 들어온 기록이 없는 동물의 ID(
- 교훈
- 조인하고 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 반환
Useful link
This post is licensed under Park Juyoung by the author.