-- 코드를 입력하세요
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE NOT REGEXP 'Spayed|Neutered'
AND O.SEX_UPON_OUTCOME REGEXP 'Spayed|Neutered'
ORDER BY I.ANIMAL_ID;
문제풀이
먼저 이 문제를 풀기위해서는 각 테이블에 대한 이해가 (약간) 필요하다.
보호소에서 중성화 수술을 거친 동물은 보호소에 들어올 때는 중성화가 되어있지 않았지만
보호소에서 나갈 때 중성화가 되었다면 즉, 보호소 안에서 중성화 수술이 이루어졌다는 말이다.
즉, 동물 보호소에 들어온 테이블에서 중성화가 안된 동물 친구들 중
입양 보낼 때 중성화가 된 동물친구들을 찾아주면 된다.
문제 설명을 보면 수컷일 경우 Neutered, 암컷일 경우 Spayed, 중성화 전 일 경우 Intact 로 표기한다.
그러므로 동물 보호소 들어온 테이블 ( 중성화가 안된 동물 친구 ) & 입양 테이블 ( 중성화가 된 동물 친구 )
동물보호소 들어온 동물 테이블 =ANIMAL_IN
입양간 동물들 테이블 = ANIMAL_OUT
조건 ANIMAL_IN 중성화 여부 컬럼에서 Intact단어가 들어간 동물들을 찾아주면 되고
ANIMAL_OUT에서는 중성화 여부 컬럼에서 Neutered, Spayed 단어가 들어간 동물들을 찾아주면된다.
이 때 LIKE 연산자와 OR 을 써도 되지만 조금 더 간결한 쿼리를 작성하기위하여 REGEXP 정규식을 사용할 수 있다.
-- 아래 코드는 무시해주세요.
SELECT * FROM ALL
-- LIKE 연산자를 사용하여 풀이
WHERE
(I.SEX_UPON_INTAKE LIKE '%Intact%')
AND
(O.SEX_UPON_OUTCOME LIKE '%Spayed%'
OR
O.SEX_UPON_OUTCOME LIKE '%Neutered%')
-- REGEXP을 사용한 조금 더 간결한 코드
WHERE
I.SEX_UPON_INTAKE REGEXP 'Intact'
AND
O.SEX_UPON_OUTCOME REGEXP 'Spayed|Neutered'
참고: REGEXO 정규식은 쉽게 LIKE IN 이라고 생각하면 쉽다.
즉 테이블A.컬럼B REGEXP '바보' = 테이블 A의 컬럼B 데이터값 중 바보라는 단어가 들어간 행을 추출하여라.