SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_없어진 기록 찾기

몽총한몽이네 2024. 2. 23. 01:01
반응형

SELECT o.ANIMAL_ID, o.NAME
FROM ANIMAL_INS as i right join ANIMAL_OUTS as o
USING (ANIMAL_ID)
WHERE 1=1
AND i.ANIMAL_ID IS NULL
AND o.ANIMAL_ID IS NOT NULL
ORDER BY 1

 

문제

입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성

 

입양을 간 기록은 있는데 보호소에 들어온 기록이 없는 동물이라면 ANIMAL_OUT의 데이터는 존재하되 ANIMAL_INS의 데이터는 없어야 한다.

 원래는 위의 두 데이터가 완벽하게 일치하여 모든 부분이 핑크색이 되거나 ANIMAL OUT이 ANIMAL IN 안에 포함되어 있어야 정상이지만 데이터 유실로 보라색부분이 밖으로 나왔다. 지금 구하려 하는부분은 보라색 부분이다. OUT 데이터는 모두 IN 안에 있어야 하지만 밖으로 IN 데이터가 없는 부분 이기 때문이다. 그러므로 이를 RIGHT JOIN으로 조인해야한다.

그냥 INNER JOIN을 하면 데이터 핑크 부분만 나와 해당 데이터 부분을 확인 할 수 없다.

 

 위와 같이 RIGHT JOIN을 주어진 키값인 ANIMAL_ID를 기준으로 JOIN 해 주고 이제 유실된 데이터가 어떤 값인지 필터링을 통해 확인해야한다.

 유실된 데이터는 OUT에는 있으면서 IN에는 없어야 한다. IN 자체가 NULL이어야 한다는 의미다 따라서 

ANIMAL_OUT IS NOT NULLANIMAL_IN IS NULL 두개를 함께 사용 하여 해답을 구해준다.

이 두개를 그대로 쓸순 없기에 해당 값을 의미하는 JOIN 컬럼인 ANIMAL_ID와 alias 명을 합쳐서 필터링 하여 값을 구하면 된다. 그 후 마무리로 정렬 하면 끝

반응형