본문 바로가기

방법/알고리즘&코딩 테스트

[Programmers] 보호소에서 중성화한 동물 Oracle

https://programmers.co.kr/learn/courses/30/lessons/59045

 

코딩테스트 연습 - 보호소에서 중성화한 동물

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

Oracle

-- 코드를 입력하세요
SELECT ANIMAL_ID, ANIMAL_TYPE, NAME
    FROM ANIMAL_INS
    WHERE (ANIMAL_ID, 'X', 'O') IN
        (SELECT ins.ANIMAL_ID,
                CASE WHEN ins.SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
                    WHEN ins.SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
                    ELSE 'X' 
                END "ins_check",
                CASE WHEN outs.SEX_UPON_OUTCOME LIKE 'Neutered%' THEN 'O'
                    WHEN outs.SEX_UPON_OUTCOME LIKE 'Spayed%' THEN 'O'
                    ELSE 'X' 
                END "outs_check"
            FROM ANIMAL_INS ins, ANIMAL_OUTS outs
            WHERE ins.ANIMAL_ID = outs.ANIMAL_ID
        )

-- SELECT ins.ANIMAL_ID,
--                 CASE WHEN ins.SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
--                     WHEN ins.SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
--                     ELSE 'X' 
--                 END "ins_check",
--                 CASE WHEN outs.SEX_UPON_OUTCOME LIKE 'Neutered%' THEN 'O'
--                     WHEN outs.SEX_UPON_OUTCOME LIKE 'Spayed%' THEN 'O'
--                     ELSE 'X' 
--                 END "outs_check"
--             FROM ANIMAL_INS ins, ANIMAL_OUTS outs
--             WHERE ins.ANIMAL_ID = outs.ANIMAL_ID

 

먼저 주석 처리한 다중 컬럼 IN을 위한 서브 쿼리를 살펴 보면,

1. 동물을 구분하기 위해 Primary key인 ANIMAL_ID를 사용

2. LIKE 문을 이용해 Neutered 혹은 Spayed로 시작하면 'O', 그렇지 않으면 'X'를 반환

3. INS 테이블과 OUTS를 각각 구해야 하므로 JOIN

 

그리고 바깥 쿼리를 살펴 보면,

1. ANIMAL_ID, ANIMAL_TYPE, NAME을 출력한다.

2. 다중 컬럼 IN을 이용하여 ANIMAL_ID(식별자 역할), 'X', 'O'를 서브쿼리와 비교하여 있으면 출력한다.