programmers.co.kr/learn/courses/30/lessons/59042
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는 생각나서 이렇게 하니까 또 맞네 ㅎㅎ 신기하다
'SQL' 카테고리의 다른 글
[ORACLE] 프로그래머스 DATETIME에서 DATE로 형 변환 (+MySQL) (0) | 2021.03.14 |
---|---|
[ORACLE] 프로그래머스 있었는데요 없었습니다 (0) | 2021.03.14 |
[ORACLE] 프로그래머스 오랜 기간 보호한 동물(1) (+MySQL) (0) | 2021.03.14 |
[ORACLE] LeetCode Second Highest Salary (0) | 2021.03.13 |
[ORACLE] 프로그래머스 입양 시각 구하기(1) (+MySQL) (0) | 2021.03.11 |