[SQL 프로그래머스 문제풀이] (JOIN) '있었는데요 없었습니다.'

윤상혁·2025년 10월 30일

1. 문제 소개

문제는 전 게시글인 '없어진 기록 찾기'와 정보는 같습니다.
다만, 요구하는 문제만 다릅니다.

우리는 이 문제를 해결해야 합니다.


2. 문제 풀이

우리는 '보호 시작일보다 입양일이 빠른 동물'을 찾아야 합니다.

JOIN 문제이지만, 저는 JOIN 없이 풀 수 있는 방법이 없을까하며 약간 고민을 했습니다.
근데, 각각 테이블을 일일이 순차적으로 비교해서 하면 로직도 복잡하고 시간도 오래걸리고.... 조인을 적용하면 이게 한번에 적용되니 이 역시도 조인을 활용하기로 했습니다.

저는 이것 또한 '오른쪽 조인 적용하면 되겠네! 대신 WHERE절 조건이 ANIMAL_INS.DATETIME < ANIMAL_OUTS.DATETIME이면 되고!' 라고 생각하고 바로 코드를 작성해보았습니다.

-- 코드를 입력하세요
SELECT
    ANIMAL_OUTS.ANIMAL_ID,
    ANIMAL_OUTS.NAME
FROM (ANIMAL_INS RIGHT OUTER JOIN ANIMAL_OUTS) -- 여기서의 문법은 FROM TABLE 부분인데, 여기서는 테이블이 오른쪽 조인된 테이블이라고 이해하면 됨. ANIMAL_INS가 왼쪽 테이블이고, ANIMAL_OUTS가 오른쪽 테이블임. 전에 벨로그 게시글에 이 부분 안 썼길래 혹시 잘 이해 못할 수도 있을까봐 주석 남김. 
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID 
WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME;

(주석은 무시하셔도 됩니다.)


2-1. 오답 및 문제 풀이 수정

하지만 오답이었습니다.
역시 한번에 성공하기는 힘들더군요..ㅠㅠ

뭐가 문제인가 해서, CLAUDE에게 물어봤습니다.

답변은 이러합니다.

1번은 괄호를 적용하면 안 되나 봅니다.
실행했을 때 괄호에 대해 에러 표시문구까지 뜨더군요?

2번은 제 단순 실수로 괄호만 바꾸면 되는 거 였습니다.

3번은 RIGHT OUTER JOIN이 문제였습니다. 이걸 적용하면 틀리더군요. 그 이유를 알아봅시다.

Q. 왜 RIGHT OUTER JOIN을 하면 틀리는가?

A.

생각해보니깐, 제가 RIGHT OUTER JOIN을 할때, ON 조건으로 ANIMAL_ID가 같은 걸로 했더군요. 그래서, 만약 이게 같지 않다면 왼쪽 테이블의 날짜 데이터가 NULL이 되는 상황이 발생합니다. 이게 문제였습니다.

그래서 RIGHT OUTER JOIN -> INNER JOIN으로 바꿔서 제출했습니다.

-- 코드를 입력하세요
SELECT
    ANIMAL_OUTS.ANIMAL_ID,
    ANIMAL_OUTS.NAME
FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS -- 여기서의 문법은 FROM TABLE 부분인데, 여기서는 테이블이 오른쪽 조인된 테이블이라고 이해하면 됨. ANIMAL_INS가 왼쪽 테이블이고, ANIMAL_OUTS가 오른쪽 테이블임. 전에 벨로그 게시글에 이 부분 안 썼길래 혹시 잘 이해 못할 수도 있을까봐 주석 남김. 
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID 
WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME;

(주석은 무시하셔도 됩니다.)

또 틀리던군요.
뭐지? 틀린 게 없는데?
또 CLAUDE에게 물어봤습니다.

논리는 완벽한데 ORDER BY의 누락이 있는지 확인하라고 하더라군요.

문제를 보니, '결과는 보호 시작일이 빠른 순으로 조회해야한다.'고 나와있습니다. 😓

마지막으로 ORDER BY를 적용하면,

-- 코드를 입력하세요
SELECT
    ANIMAL_OUTS.ANIMAL_ID,
    ANIMAL_OUTS.NAME
FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS -- 여기서의 문법은 FROM TABLE 부분인데, 여기서는 테이블이 오른쪽 조인된 테이블이라고 이해하면 됨. ANIMAL_INS가 왼쪽 테이블이고, ANIMAL_OUTS가 오른쪽 테이블임. 전에 벨로그 게시글에 이 부분 안 썼길래 혹시 잘 이해 못할 수도 있을까봐 주석 남김. 
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID 
WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME
ORDER BY ANIMAL_INS.DATETIME ASC;

정답입니다!


3. 마무리 및 결론

이렇게 또 다른 LEVEL 3의 JOIN 문제를 풀어보았습니다.
전의 문제와는 약간 다르면서 재밌네요 ㅎㅎ

다음에 또 다른 JOIN 문제로 찾아뵙도록 하겠습니다~

profile
통합형 개발자. 기획부터 개발, 자동화까지. 문제를 구조적으로 이해하고, AI를 능동적으로 활용해 본질적인 해결책을 제시하는 사람입니다.

0개의 댓글