프로그래머스 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
이렇게 제일 위에 있는 코드랑 같은 코드가 된다.
이 문제는 이렇게 끝난다.
'프로그래머스 문제' 카테고리의 다른 글
프로그래머스 Java (푸드 파이트 대회) (0) | 2024.07.18 |
---|---|
프로그래머스 Java 콜라 문제 (0) | 2024.07.18 |
프로그래머스 JAVA( 명예의 전당 (1) ) (0) | 2024.07.18 |
프로그래머스 SQL 문제(재구매가 일어난 상품과 회원리스트) (0) | 2024.07.18 |
프로그래머스 SQL 과일로 만든 아이스크림 (0) | 2024.07.17 |