CodingTest Practice/Programmers

프로그래머스 : JOIN (SQL, ORACLE)

몽땅마니아(MDD) 2022. 6. 6. 15:43

https://programmers.co.kr/learn/courses/30/lessons/59042?language=oracle 

 

코딩테스트 연습 - 없어진 기록 찾기

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

programmers.co.kr

입양테이블은 왼쪽에 두고 입소 테이블과 LEFT JOIN을 한 후,  입소 테이블의 ID가 비어있는 컬럼을 조회

-- 코드를 입력하세요
SELECT OUTS.ANIMAL_ID AS ANIMAL_ID, OUTS.NAME AS NAME
FROM ANIMAL_OUTS OUTS LEFT JOIN ANIMAL_INS INS
ON OUTS.ANIMAL_ID=INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY OUTS.ANIMAL_ID, OUTS.NAME;

https://programmers.co.kr/learn/courses/30/lessons/59043?language=oracle 

 

코딩테스트 연습 - 있었는데요 없었습니다

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

programmers.co.kr

DATE 컬럼도 비교가 가능하므로 JOIN 후 입양날짜 보다 입소날짜가 빠른 컬럼을 조회한다.

-- 코드를 입력하세요
SELECT INS.ANIMAL_ID AS ANIMAL_ID, INS.NAME AS NAME
FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME;

https://programmers.co.kr/learn/courses/30/lessons/59044?language=oracle 

 

코딩테스트 연습 - 오랜 기간 보호한 동물(1)

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

programmers.co.kr

인라인 뷰와 ROWNUM 을 이용해 3개의 컬럼만 조회

-- 코드를 입력하세요
SELECT *
FROM
(
    SELECT INS.NAME AS NAME, INS.DATETIME AS DATETIME
    FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS
    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
    WHERE OUTS.ANIMAL_ID IS NULL
    ORDER BY INS.DATETIME
)
WHERE ROWNUM <=3;

https://programmers.co.kr/learn/courses/30/lessons/59045?language=oracle 

 

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

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

programmers.co.kr

중성화 수술을 했다면 SEX_UPON_INTAKE컬럼과 SEX_UPON_OUTCOME컬럼의 값이 달라지는 것을 이용해 풀었다.

(중성화 했는데 다시 성을 달거나 남성에서 여성으로 바꼈을리는 없을테니...?)

-- 성이 바뀐 컬럼 조회
SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME
FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE != OUTS.SEX_UPON_OUTCOME
ORDER BY OUTS.ANIMAL_ID;

-- 중성화 전 성별(Intact%)에서 중성화(Spayed% 또는 Neutered%) 후 성별로 바뀐 컬럼 조회
SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME
FROM ANIMAL_INS INS LEFT JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE SEX_UPON_INTAKE LIKE 'Intact%' AND 
(SEX_UPON_OUTCOME LIKE 'Spayed%' OR SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY OUTS.ANIMAL_ID;