[SQL] 프로그래머스 SQL 고득점 kit (6)

이정진·2021년 10월 15일
0

SQL

목록 보기
6/23
post-thumbnail

JOIN ON과 관련된 문제들을 풀어보았는데, JOIN 조건 활용 과정에서 가장 많이 참고했던 그림이 있었다.
image.jpg
이 그림을 통해 JOIN문을 작성할 때, LEFT, RIGHT, INNER, OUTER 등을 생각해보며 문제에 접근해볼 수 있어 도움이 많이 되었다.

없어진 기록 찾기

SQL 구분 : JOIN

문제

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문을 작성해주세요.

문제 풀이

입양을 간 기록은 있으나, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 조회해야 한다.
즉 OUTS 테이블에 기록이 있으면서, INS 테이블에 들어온 기록이 없는 동물을 찾아야 한다는 것이다. 문제의 예시를 보면 ANIMAL_ID가 ANIMAL_INS에 없을 경우, 데이터가 유실되었다고 본다고 설명이 되어 있어, 이를 통해 where절에서 where ANIMAL_INS.ANIMAL_ID is null을 통한 조건을 걸어야함을 알 수 있다. OUTS를 기존 테이블로 하여 INS 테이블을 LEFT JOIN 시켜 where절을 위와 같이 작성하면 조회할 수 있다.

SQL

SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS 
LEFT JOIN ANIMAL_INS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
where ANIMAL_INS.ANIMAL_ID is null

있었는데요 없었습니다.

SQL 구분 : JOIN

문제

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의 외래 키입니다.

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

문제 풀이

처음의 없어진 기록 찾기 문제와 동일하게 OUTS에 LEFT JOIN으로 INS를 연결하였으며, 문제에서 보호 시작일보다 입양일이 더 빠른 동물의 아디이와 이름을 조회해달라고 하였으므로 WHERE ANIMAL_OUTS.DATETIME <= ANIMAL_INS.DATETIME을 통해 조건을 걸어주었으며, 결과는 보호 시작일이 빠른 순으로 조회해야 하므로 ORDER BY ANIMAL_INS.DATETIME ASC를 통해 정렬 조건을 걸었다.

SQL

SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_OUTS.DATETIME <= ANIMAL_INS.DATETIME
ORDER BY ANIMAL_INS.DATETIME ASC

0개의 댓글