알고리즘/SQL
[프로그래머스] Oracle : JOIN
쿠큭다스
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