-
코딩테스트 연습> JOIN> 없어진 기록 찾기SQL/Programmers 2020. 9. 28. 22:44728x90
<문제링크: programmers.co.kr/learn/courses/30/lessons/59042>
문제설명: 'ANIMAL_INS' 테이블과 'ANIMAL_OUTS' 테이블이 주어지고 두 테이블은 ANIMAL_ID를 공유한다.
입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물을 조회해야 하므로
ANIMAL_OUTS에는 있지만, ANIMAL_INS에는 없는 동물의 ID와 NAME을 조회하면 된다.
[1차 시도]
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_INS I RIGHT (OUTER) JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID WHERE I.ANIMAL_ID IS NULL ORDER BY O.ANIMAL_ID;
풀이: SELECT에는 조회할 ANIMAL_OUTS의 별칭 O를 써서 ANIMAL_ID와 NAME을 지정한다.
FROM에는 ANIMAL_INS의 별칭(AS 생략 가능) I로 기준을 두고 RIGHT JOIN(OUTER 생략 가능)으로
ANIMAL OUTS과 묶어준다. 이때 ON을 사용하여 두 테이블의 ANIMAL_ID로 묶어준다.
그러면 이제 데이터는 ANIMAL_OUTS 테이블의 모든 레코드를 가리킨다. (위 그림의 오른쪽 영역 전부)
따라서 WHERE 절을 사용하여 ANIMAL_INS의 데이터를 제외해야 한다.
=> WHERE I.ANIMAL_ID IS NULL
그러면 이제 오른쪽 영역에서 왼쪽 영역과의 교집합을 뺀 나머지 레코드를 조회할 수 있다.
문제에서 ID 순으로 조회하라고 했으므로 ORDER BY O.ANIMAL_ID를 했지만 생략해도 무방하다.
채첨결과: 제출하면 정상적으로 잘 통과한다.
[2차 시도]
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O LEFT OUTER JOIN ANIMAL_INS I ON I.ANIMAL_ID = O.ANIMAL_ID WHERE I.ANIMAL_ID IS NULL ORDER BY O.ANIMAL_ID;
풀이: 이번엔 두 테이블의 위치를 바꿔 LEFT OUTER JOIN을 사용한 SQL문으로 시도해봤다.
전체적으로 동일하지만, 테이블의 위치를 바꿔야 하므로
FROM에 ANIMAL_OUTS이 오고
LEFT OUTER JOIN(OUTER 생략 가능)에는 ANIMAL_INS로 바꿔주면 된다.
채첨결과: 정상적으로 잘 통과한다.
'SQL > Programmers' 카테고리의 다른 글
코딩테스트 연습> GROUP BY> 동명 동물 수 찾기 (0) 2020.10.03 코딩테스트 연습> SELECT> 아픈 동물 찾기 (0) 2020.09.30 코딩테스트 연습> GROUP BY> 고양이와 개는 몇 마리 있을까 (0) 2020.08.27 코딩테스트 연습> SUM, MAX, MIN> 최댓값 구하기 (0) 2020.08.11 코딩테스트 연습> SELECT> 역순 정렬하기 (0) 2020.08.10