繩鋸木斷水滴石穿/SQL

[프로그래머스] SQL 고득점 Kit : JOIN

stranger95 2020. 2. 6. 14:45

※ 모든 코드는 Oracle을 기준으로 작성되었습니다.

 

1. 없어진 기록 찾기

문제설명

Solutions

1
2
3
4
5
6
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O 
LEFT OUTER JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID;
cs

코드해석

입양을 간 기록은 있는데 보호소에 들어온 기록이 없다면 입양 간 동물의 정보를 담은 테이블 ANIMAL_OUTS의 모든 값이 일단 조회가 되어야겠죠. 그래서 ANIMAL_ID을 기준으로 LEFT JOIN을 사용하여 조인을 수행하고요, ANIMAL_INS의 ANIMAL_ID가 존재하지 않는다면 NULL로 채워지게 됩니다. 조인 후, ANIMAL_INS의 ANIMAL_ID가 NULL인 행을 추출하고, ID순으로 정렬합니다.

 

2. 있었는데요 없었습니다

문제설명

Solutions

1
2
3
4
5
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME;
cs

코드해석

우선 ANIMAL_ID를 기준으로 두 테이블을 INNER JOIN 합니다. 보호 시작일보다 입양일이 빠르다는 것을 수식으로 표현하면 보호 시작일 > 입양일 입니다. 빠른 날짜가 더 작은 값이기 때문이죠. WHERE절로 보호 시작일보다 입양일이 빠른 경우를 추출하고, 보호 시작일순으로 정렬합니다.

 

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

문제설명

Solutions

1
2
3
4
5
6
7
8
SELECT NAME, DATETIME
FROM (SELECT I.NAME, I.DATETIME
            FROM ANIMAL_INS I
            LEFT OUTER JOIN ANIMAL_OUTS O
            ON I.ANIMAL_ID = O.ANIMAL_ID
            WHERE O.ANIMAL_ID IS NULL
            ORDER BY DATETIME)
WHERE ROWNUM <= 3;
cs

코드해석

서브쿼리 내에서 LEFT JOIN을 ANIMAL_ID 기준으로 수행하여 ANIMAL_INS의 행은 모두 조회되도록 합니다. 아직 입양을 못 갔다면 ANIMAL_INS에 기록이 존재하는 반면 ANIMAL_OUTS의 ANIMAL_ID는 비어있는 NULL 값이 되겠죠. 가장 오래 보호소에 있었던 동물들을 조회하기 위해 보호 시작일 순으로 정렬합니다. 정렬 후 가장 오래 보호 중인 3마리만 조회하기 위해 ROWNUM을 사용해 1, 2, 3행만 조회하였습니다. 실행 결과는 다음과 같습니다.

 

4. 보호소에서 중성화한 동물

문제설명

Solutions

1
2
3
4
5
6
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%'
    AND O.SEX_UPON_OUTCOME NOT LIKE 'Intact%'
ORDER BY ANIMAL_ID;
cs

코드해석

ANIMAL_ID를 기준으로 INNER JOIN을 사용해 두 테이블을 조인합니다. 중성화를 거치지 않은 동물은 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어 있다고 하네요. WHERE절에서 LIKE 연산자를 사용하여 보호소에 들어올 당시에는 중성화되지 않았지만 나갈 때에는 중성화된 경우만 추출합니다. 와일드 카드인 %는 개수에 관계없는 모든 문자를 의미합니다. 'Intact%'는 Intact로 시작하는 모든 값을 추출합니다. 중성화를 거친 동물은 Intact라고 표시되어 있지않기 때문에 간단하게 NOT LIKE를 사용하였습니다. 추출 후 ID순으로 정렬합니다.