본문 바로가기
SQL

[프로그래머스] SQL 고득점 Kit : JOIN 풀이 (Oracle)

by 유림유림 2021. 3. 31.
반응형

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
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형

댓글