본문 바로가기

프로그래머스 문제

프로그래머스 SQL (없어진 기록 찾기)

프로그래머스 SQL (없어진 기록 찾기)

   이 문제는 천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.  라는 문제이다

SELECT AO.ANIMAL_ID, AO.NAME
FROM ANIMAL_OUTS AO LEFT JOIN ANIMAL_INS AI ON AO.ANIMAL_ID = AI.ANIMAL_ID
WHERE AI.ANIMAL_ID IS NULL

 

 

1. SELECT 문으로 AO (ANIMAL_OUTS) TABLE 에서 ANIMAL_ID 랑 NAME을 조회

2. FROM 문에서 ANIMAL_OUTS (AO) 랑 ANIMAL_INS (AI) 를 LEFT JOIN으로 두 TABLE을 합침

3. WHERE문으로 AI (ANIMAL_INS)가 NULL인 것만을 조건으로 검

 

처음 이 문제를 봤을 때 ANIMAL_INS를 앞에 쓰고 ANIMAL_OUTS 를 뒤에 써서 LEFT JOIN으로 합쳤는데 

FROM ANIMAL_INS AI LEFT JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID

 

이렇게 FROM문을 작성하고 조회를 해보니 아무런 데이터도 안 나왔다.

 

저렇게 된 이유를 찾아보니 LEFT JOIN 방향의 문제라고 뜬다.  그 이유는 아래와 같다.

 

  • LEFT JOIN은 기준 테이블의 모든 행을 포함하고, 조인된 테이블에서 일치하는 값이 없는 경우 NULL 값을 반환한다.
  • 위 쿼리에서 LEFT JOIN의 기준 테이블은 ANIMAL_INS (AI)입니다. 따라서 ANIMAL_INS의 모든 행이 포함되고, ANIMAL_OUTS (AO)에 일치하는 값이 없을 때 NULL을 반환한다
  • 하지만 조건문 WHERE AI.ANIMAL_ID IS NULL은 ANIMAL_INS 테이블에서 ANIMAL_ID가 NULL인 행을 찾으려 합니다. ANIMAL_INS 테이블의 기본 키인 ANIMAL_ID는 NULL일 수 없으므로 결과적으로 아무런 행도 반환하지 않는다.

저 문제의 해결방안은 아래와 같다.

 

ANIMAL_OUTS 테이블의 ANIMAL_ID가 ANIMAL_INS 테이블에 없는 경우를 찾기 위해서는

ANIMAL_OUTS를 기준 테이블로 설정해야 합니다. 이를 위해 LEFT JOIN의 기준을 변경해야 한다.

 

이 해결방안으로 다시 작성을 하면 

SELECT AO.ANIMAL_ID, AO.NAME
FROM ANIMAL_OUTS AO LEFT JOIN ANIMAL_INS AI ON AO.ANIMAL_ID = AI.ANIMAL_ID
WHERE AI.ANIMAL_ID IS NULL

 

이렇게 제일 위에 있는 코드랑 같은 코드가 된다.

 

이 문제는 이렇게 끝난다.