:< [프로그래머스 SQL] 없어진 기록 찾기

kiki·2024년 1월 12일
0

프로그래머스

목록 보기
58/76

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/59042

문제 설명

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

1차 시도

SELECT ANIMAL_ID, NAME FROM(
    SELECT ANIMAL_ID, O.NAME, INTAKE_CONDITION FROM ANIMAL_OUTS O
    LEFT OUTER JOIN ANIMAL_INS I USING(ANIMAL_ID) 
    ) S
    WHERE INTAKE_CONDITION IS NULL
    ORDER BY ANIMAL_ID;

서브쿼리에서 IN과 OUT을 OUTER JOIN하는데 OUT에 없는 필드를 같이 SELECT해 이 값이 NULL인 데이터의 ANIMAL_ID와 NAME을 조회

근데 사실 여기서 LEFT OUTER JOIN을 쓸 필요는 없다. LEFT JOIN만 해도 충분

2차 시도

SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS
    WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
    ORDER BY ANIMAL_ID;

이건 JOIN을 쓰지 않는 방법. 하지만 이 문제는 JOIN을 이용하는 문제니 이건 땡!
근데 궁금한 건 ANIMAL_ID 대신 NAME을 쓰면 안된다는 것. 뭐가 다르지?

  • 이름은 중복될 수 있어서 안되는건가??

3차 시도

SELECT ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
    LEFT JOIN ANIMAL_INS I USING(ANIMAL_ID)
    WHERE I.ANIMAL_ID IS NULL
    ORDER BY ANIMAL_ID;

LEFT JOIN을 이용한 방법.
LEFT JOIN하면 ANIMAL_INS에 없지만 ANIMAL_OUTS엔 있는 ANIMAL_ID도 조회되고, 그리고 WEHRE에서 INS에서 ANIMAL_ID가 없는 것만 걸러내는 방법.
근데 WHERE I.ANIMAL_ID IS NULL에서 I라고 하면 어떤게 참조되는 걸까??

  • 말 그대로 조인 된 테이블에서 I의 animal_id가 조회되는 것

4차 시도

SELECT ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O
    LEFT JOIN ANIMAL_INS I USING(ANIMAL_ID)
    WHERE I.INTAKE_CONDITION IS NULL
    ORDER BY ANIMAL_ID;

만약에 위에 코드가 이해되지 않는다면, 이렇게 하면 이해가 될 것 같다. INTAKE_CONDITION은 INS에만 있는 필드니 JOIN 후 INS에 없는 OUTS의 데이터 들은 이 필드에 NULL값을 가질테니.

이렇게 보면 위에서 JOIN후 I를 참조하는 게 JOIN 후에 두 테이블이 JOIN 후 각각의 테이블을 갖는다고 보면 되려나? 그니까 JOIN 후 O, JOIN 후 I의 테이블을 갖는거지. 그렇다면 이해가 된다.
뭔가.. 데이터의 메모리 구조??를 보면 이해가 될듯. 찾아보자.

정리

  • OUTER JOIN: 합집합을 의미. 참고로 LEFT JOIN은 교집합을 의미
  • USING: JOIN 시 ON 할 필드의 이름이 같다면 USING(필드명)으로 ON A.필드명=B.필드명을 대신할 수 있다.

0개의 댓글