본문으로 바로가기

[프로그래머스] Oracle : JOIN

category 알고리즘/SQL 2022. 1. 19. 14:33
728x90

 

없어진 기록 찾기

 

- ANIMAL_OUTS 테이블에는 있고, ANIMAL_INS 테이블에는 없는 정보를 찾아야 하므로

두 테이블을 조인할 때 외부조인을 이용하고 ANIMAL_INS의 정보가 모두 나타나도록 한것 중에서

ANIMAL_INS의 아이디가 유실된 것을 조회하면 된다.

 

SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID(+)=O.ANIMAL_ID AND I.ANIMAL_ID IS NULL
ORDER BY 1;

 

 

있었는데요 없었습니다

 

- 보호 시작일과 입양일을 비교해야 하는 조건에서 ANIMAL_ID는 동일하고

보호 시작일은 ANIMAL_INS 테이블의 DATETIME, 입양일은 ANIMAL_OUTS의 DATETIME이므로

이 둘을 조인하여 풀이를 하면 된다.

 

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID=O.ANIMAL_ID AND I.DATETIME>O.DATETIME
ORDER BY I.DATETIME ASC;

 

 

오랜 기간 보호한 동물(1)

 

- 입양을 못 간 동물은 동물 보호소에는 들어왔지만 (ANIMAL_INS에 있지만), 동물 보호소에서 입양을 보내지는 않은

(ANIMAL_OUTS에는 없는) 상태를 말한다.

따라서, 왼쪽 외부조인을 통해 O.ANIMAL_ID가 NULL인 경우를 모두 표시한 뒤

결과 중 ANIMAL_OUTS가 NULL인 경우를 개수에 맞춰 출력하면 된다.

 

SELECT NAME, DATETIME
FROM (SELECT I.NAME, I.DATETIME
      FROM ANIMAL_INS I, ANIMAL_OUTS O
      WHERE I.ANIMAL_ID=O.ANIMAL_ID(+) 
      AND O.ANIMAL_ID IS NULL ORDER BY 2)
WHERE ROWNUM<=3;

 

 

보호소에서 중성화한 동물

 

- 중성화를 거치지 않은 동물은 Intact로 시작, 중성화를 거친 동물은 Spayed  또는 Neutered로 시작을 하므로

이에 따라 각각의 테이블에 조건을 설정하면 된다.

 

SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID=O.ANIMAL_ID AND
I.SEX_UPON_INTAKE LIKE 'Intact %' AND 
(O.SEX_UPON_OUTCOME LIKE 'Spayed %' OR O.SEX_UPON_OUTCOME LIKE 'Neutered %')
ORDER BY 1;
728x90