본문 바로가기
개발/database

[Oracle] programmers - 없어진 기록 찾기

by ujin2021 2021. 8. 5.

문제 : https://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

ANIMAL_OUTS 테이블 에는 존재하지만, ANIMAL_INS 테이블에는 존재하지 않는 동물의 ID, NAME을 SELECT 하는 문제이다. ID로 오름차순 정렬하여 출력해야한다.

 

첫번째 방법 - 서브쿼리 사용하기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID;

제일 처음 떠올렸던 방법이다.

ANIMAL_OUTS 테이블의 ANIMAL_ID 중에 ANIMAL_INS 테이블에는 없는 ID를 조회한다

 

두번째 방법 - LEFT JOIN 사용하기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS A
LEFT JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.ANIMAL_ID;

ANIMAL_OUTS 테이블의 alias 를 A로, ANIMAL_INS 테이블의 alias를 B로 설정했다.

ANIMAL_OUTS 를 기준으로 LEFT JOIN 해야한다. 만약 ANIMAL_INS를 기준으로 LEFT JOIN 하면 ANIMAL_INS에 존재하는 ANIMAL_ID만 나오기 때문에 둘의 차이를 알 수 없다.

JOIN은 각 테이블의 ANIMAL_ID를 기준으로 했다 (ON 부분)

LEFT JOIN을 하게 되면, A에는 있는 ID가 B에는 없으므로 B.ANIMAL_ID 가 NULL 인 tuple이 존재한다. 따라서 이 null 인 tuple에서 ANIMAL_ID를 가져오면 된다.

 

SELECT *
FROM ANIMAL_OUTS A
LEFT JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.ANIMAL_ID;

이렇게 LEFT JOIN 한 것만 실행시켜보면

이런식으로 결과가 출력이 되는데, 이때 상위 3개의 튜플과 같이 A의 ANIMAL_ID는 존재하지만, B의 ANIMAL_ID는 NULL 인 튜플이 정답인것이다!