SQL

[ORACLE] 프로그래머스 없어진 기록 찾기

랩실외톨이 2021. 3. 14. 06:09
반응형

programmers.co.kr/learn/courses/30/lessons/59042

 

코딩테스트 연습 - 없어진 기록 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

1. 서론

 

join을 활용한 문제. 아주 개념 공부하기 좋았다.

 

2. 문제 풀이

 

ANIMAL_INS: 동물 보호소에 들어온 동물의 정보를 담은 테이블

테이블 구조

ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE

(각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부)

 

ANIMAL_OUTS: 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

테이블 구조:

ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME

(각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부)

 

Q. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

 

입양을 간 기록 => animal_outs 테이블

보호소에 들어온 기록 => animal_ins 테이블

 

두 테이블을 조인해서 비교해서 답을 내는 문제다. 말 그대로 outs 테이블에는 있는데 ins 테이블에는 적혀있지 않은 동물을 찾아서 출력하면 된다. 처음에는 단순히 아이디 간에 비교를 하면 되는 건가 했는데 not in을 활용하면 쉽게 풀 수 있다.

outs not in ins 즉, outs 테이블에는 있는데 ins 테이블에는 없는 값만 골라서 출력할 수 있는 것이다.

 

3. 코드 설명

 

SELECT animal_id, name
FROM animal_outs
WHERE animal_id NOT IN (SELECT animal_id FROM animal_ins)
ORDER BY animal_id;

 

animal_id는 동물의 고유 번호이기 때문에 이를 ins 테이블에 있는 동물의 id와 outs 테이블에 있는 동물의 id와 비교해 값을 출력했다.

 

+ 다시 복습겸 돌리다가 다른 방법 발견

 

SELECT animal_id, name
FROM animal_outs
MINUS
SELECT animal_id, name
FROM animal_ins

 

 

animal_outs에는 있고 animal_ins에는 없는 값을 구하는 것이 문제이므로 이렇게 Oracle의 MINUS 구문을 통해서 위의 쿼리에서 나온 값에서 아래 쿼리에 있는 값을 빼주는 것이다. 너무 오랜만에 푸는 거라 NOT IN이 생각이 안 나고 MINUS는 생각나서 이렇게 하니까 또 맞네 ㅎㅎ 신기하다

 

 

반응형