본문 바로가기
Mysql

프로그래머스 SQL 고득점 Kit (JOIN) 없어진 기록 찾기

by 열정적인 이찬형 2021. 11. 9.

문제 링크

프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. 

ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME,SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

 

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

ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.


테이블

ANIMAL_INS

ANIMAL_OUTS


문제 결과

예를 들어 ANIMAL_INS 테이블이

ANIMAL_OUTS 테이블이 이와 같다면.

  • Allie의 ID는 ANIMAL_INS에 없으므로, Allie의 데이터는 유실되었습니다.
  • Gia의 ID는 ANIMAL_INS에 있으므로, Gia의 데이터는 유실되지 않았습니다.
  • Spice의 ID는 ANIMAL_INS에 없으므로, Spice의 데이터는 유실되었습니다.

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.


접근 방법

  • SQL 문의 조회 명령어 SELECT문에서 ANIMAL_ID,NAME을 출력해야 한다.
  • ANIMAL_INSANIMAL_OUTS에 동일한 이름의 속성이 존재하여 AS로 별칭을 주어 분류하였습니다.
  • 입양 간 기록(ANIMAL_OUTS)에 있는데 보호소에 들어온 기록(ANIMAL_INS)에 없는 ANIMAL_ID를 찾는 문제로 해석하였습니다.
  • ANIMAL_OUTS에 LEFT OUTER JOIN ANIMAL_INS를 하였습니다.

LEFT OUTER JOIN

테이블명 LEFT OUTER JOIN 테이블명 ON 조건

 

LEFT OUTER JOIN은 왼쪽에 있는 테이블을 기준으로 조건에 맞게 JOIN(속성들이 합쳐짐)이 진행되며 왼쪽에 있는 속성들에서 조건에 만족하는 오른쪽 테이블 값이 존재하지 않을 경우 NULL로 취급하여 합쳐진다.  

예시.

SELECT * FROM ANIMAL_OUTS AS A LEFT OUTER JOIN ANIMAL_INS AS B ON A.ANIMAL_ID = B.ANIMAL_ID

일부 결과(검은색 네모칸은 NULL)

 

  • JOIN했을 때 NULL값이 있는 행이 입양 기록은 있지만 보호소에 들어간 기록이 없는 기록으로 볼 수 있습니다. 그래서 WHERE(조건)문에 B.ANIMAL_ID IS NULL을 넣어서 해결하였습니다.

결과 코드

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

댓글