반응형
JOIN 문제 풀이
프로그래머스 SQL 고득점 Kit 중 출제 빈도가 높은 JOIN 문제를 풀이해보겠습니다.
없어진 기록 찾기 (Level 3)
ANIMAL_OUTS 테이블의 데이터 중 ANIMAL_INS에 없는 데이터를 조회합니다.
방법 1. NOT EXISTS 활용
- ANIMAL_OUTS 테이블에 NOT EXISTS문을 적용합니다.
- ID 순으로 정렬합니다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
WHERE NOT EXISTS (SELECT 1
FROM ANIMAL_INS I
WHERE I.ANIMAL_ID = O.ANIMAL_ID
)
ORDER BY ANIMAL_ID
;
방법 2. OUTER JOIN, IS NULL 활용
- ANIMAL_OUTS과 ANIMAL_INS를 OUTER JOIN하고,
- ANIMAL_INS의 키에 IS NULL 조건을 걸어줍니다.
- ID 순으로 정렬합니다.
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
, ANIMAL_INS I
WHERE O.ANIMAL_ID = I.ANIMAL_ID(+)
AND I.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID
;
있었는데요 없었습니다. (Level 3)
보호시작일보다 입양일이 빠른 동물을 조회합니다.
- ANIMAL_INS와 ANIMAL_OUT을 INNER JOIN하고,
- 보호시작일 > 입양일 조건을 걸어줍니다.
- 보호시작일 순으로 정렬합니다.
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
오랜 기간 보호한 동물(1) (Level 3)
ANIMAL_INS 테이블의 데이터 중 ANIMAL_OUTS에 없는 데이터를 조회해서 보호시작일 순으로 3행을 조회합니다. "없어진 기록 찾기" 문제에서 처럼 NOT EXISTS 문이나 OUTER JOIN, IS NULL을 활용할 수 있습니다.
방법 1. NOT EXISTS 활용
- ANIMAL_INS 테이블에 NOT EXISTS문을 적용한 다음 보호시작일 순으로 정렬하고,
- 서브쿼리로 감싼 다음 ROWNUM <= 3 조건을 걸어 상위 3개 행을 조회합니다.
SELECT NAME, DATETIME
FROM (
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
WHERE NOT EXISTS (SELECT 1
FROM ANIMAL_OUTS O
WHERE O.ANIMAL_ID = I.ANIMAL_ID
)
ORDER BY I.DATETIME
)
WHERE ROWNUM <= 3
;
방법 2. OUTER JOIN, IS NULL 활용
- ANIMAL_INS와 ANIMAL_OUT을 OUTER JOIN하고,
- ANIMAL_OUTS의 키에 IS NULL 조건을 걸어줍니다.
- 서브쿼리로 감싼 다음 ROWNUM <= 3 조건을 걸어 상위 3개 행을 조회합니다.
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 I.DATETIME
)
WHERE ROWNUM <= 3
;
보호소에서 중성화한 동물 (Level 4)
- ANIMAL_INS와 ANIMAL_OUT을 INNER JOIN한 다음,
- ANIMAL_INS의 성별 키워드가 Intact로 시작하는 조건을 걸고,
- ANIMAL_OUTS의 성별 키워드가 Spayed 또는 Neutered로 시작하는 조건을 걸어줍니다. (OR 조건은 반드시 괄호로 감싸야 합니다.)
- ID, 종, 이름 순으로 정렬합니다.
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 ANIMAL_ID, ANIMAL_TYPE, NAME
;
- 중성화를 거친 동물의 키워드가 Spayed 또는 Neutered로 시작한다는 조건이 명시되어 있기 때문에 각각 LIKE문과 OR 조건을 통해 구현하는 것이 성능상 유리하겠지만, NOT LIKE문을 활용해서 간략하게 표현할 수 있습니다.
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 NOT LIKE 'Intact%'
ORDER BY ANIMAL_ID, ANIMAL_TYPE, NAME
;
문제 출처
프로그래머스 > 코딩테스트 연습 > SQL 고득점 Kit > JOIN
반응형
'SQL' 카테고리의 다른 글
[HackerRank] Print Prime Number 풀이 (Oracle) (0) | 2021.03.18 |
---|---|
[HackerRank] Binary Tree Nodes 풀이 (Oracle) (0) | 2021.03.16 |
[HackerRank] Weather Observation Station 20 풀이 (Oracle) (0) | 2021.03.15 |
[HackerRank] Interviews 풀이 (Oracle) (0) | 2021.03.10 |
[HackerRank] Occupations 풀이 (Oracle) (0) | 2021.03.08 |
[HackerRank] 15 Days of Learning SQL 풀이 (Oracle) (0) | 2021.02.27 |
[HackerRank] Weather Observation Station 5 풀이 (Oracle) (0) | 2021.02.26 |
댓글