일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 백준
- 다익스트라
- JOIN
- 피로그래밍
- 알고리즘
- AWS
- db
- 배포
- BFS
- OrderBy
- EC2
- 구현
- Database
- Pirogramming
- django
- Baekjoon
- 프림
- 그래프 탐색
- SQL코딩테스트
- MST
- 프로그래머스
- 최단경로
- Java
- 누적합
- GROUPBY
- 크루스칼
- union find
- 코딩테스트
- SQL
- 자바
Archives
- Today
- Total
NullNull
프로그래머스 SQL 없어진 기록 찾기 본문
Data 구조
ANIMAL_INS : 동물 보호소에 들어온 동물의 정보를 담은 테이블
NAME | TYPE | NULLABLE |
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 : 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블
NAME | TYPE | NULLABLE |
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 문을 작성해주세요.
예시
Input:
ANIMAL_INS
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
A352713 | Cat | 2017-04-13 16:29:00 | Normal | Gia | Spayed Female |
A350375 | Cat | 2017-03-06 15:01:00 | Normal | Meo | Neutered Male |
ANIMAL_OUTS
ANIMAL_ID | ANIMAL_TYPE | DATTETIME | NAME | SEX_UPON_OUTCOME |
A349733 | Dog | 2017-09-27 19:09:00 | Allie | Spayed Female |
A352713 | Cat | 2017-04-25 12:25:00 | Gia | Spayed Female |
A349990 | Cat | 2018-02-02 14:18:00 | Spice | Spayed Female |
Output:
ANIMAL_ID | NAME |
A349733 | Allie |
A349990 | Spice |
정답:
JOIN을 적절하게 사용하는 문제이다. 문제의 조건을 살펴보면 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물을 조회하는 것임을 알 수 있다. 여기서 입양을 간 기록은 ANIMAL_OUTS에 저장되고 보호소에 들어온 기록은 ANIMAL_INS에 저장됨을 생각하자.
입양을 간 기록은 있어야 하므로 두 테이블을 JOIN 한 뒤에 ANIMAL_OUTS 가 NULL이 아니고 ANIMAL_INS 가 NULL인 정보를 찾으면 된다. 이때 어떤 테이블을 JOIN의 대상으로 삼는지에 따라 LEFT JOIN과 RIGHT JOIN이 결정난다.
ANIMAL_OUTS 테이블에 ANIMAL_INS 테이블을 JOIN하는 것이라면 LEFT JOIN을 한 뒤에 INNER JOIN 되는 부분을 제거하면 된다.
SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_OUTS A LEFT JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL;
반대로 ANIMAL_INS 테이블에 ANIMAL_OUTS 테이블을 JOIN 하는 것이라면 RIGHT JOIN을 한 뒤에 INNER JOIN 되는 부분을 제거하면 된다.
SELECT B.ANIMAL_ID, B.NAME FROM ANIMAL_INS A RIGHT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL;
'SQL' 카테고리의 다른 글
프로그래머스 SQL 오랜 기간 보호한 동물(1) (0) | 2022.03.01 |
---|---|
프로그래머스 SQL 있었는데요 없었습니다 (0) | 2022.03.01 |
MySQL DB JOIN 정리 (0) | 2022.03.01 |
프로그래머스 SQL NULL 처리하기 (0) | 2022.02.28 |
프로그래머스 SQL 이름이 있는 동물의 아이디 (0) | 2022.02.28 |
Comments