SQL 고득점 Kit - 7.20

김동현·2024년 7월 20일

SQL 고득점 Kit

목록 보기
5/56

JOIN - 없어진 기록 찾기

문제

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

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

풀이

SELECT 
    ao.ANIMAL_ID, 
    ao.NAME
FROM 
    ANIMAL_INS ai
LEFT JOIN
    ANIMAL_OUTS ao
ON 
    ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE 
    ai.ANIMAL_ID IS NULL
    
UNION

SELECT 
    ao.ANIMAL_ID, 
    ao.NAME
FROM 
    ANIMAL_INS ai
RIGHT JOIN
    ANIMAL_OUTS ao
ON 
    ai.ANIMAL_ID = ao.ANIMAL_ID
WHERE 
    ai.ANIMAL_ID IS NULL

리뷰

  • 해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블을 조인하여 형태를 만들어준다.
    --> Mysql은 FULL OUTER JOIN을 지원하지 않기 때문에 UNION으로 합쳐야 한다.
  • ANIMAL_ID 을 KEY 로 JOIN 진행.
  • ai.ANIMAL_ID IS NULL 의 조건으로 두 조인 테이블을 출력을 수정

해당 쿼리를 보고 너무 가독성도 그렇고 중복되는 코드이기 때문에 더 좋은 코드가 있는지 Chat GPT 씨에게 물어봄 ㅎㅎ

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

LEFT JOIN만으로 충분히 원하는 코드를 사용할 수 있어 더 좋은 가독성의 코드를 생성할 수 있었다. (반대로 RIGHT 조인도 가능)

  • 처음에 FULL OUTER JOIN을 사용해야 한다고 접근했다. (두 테이블에서 서로 없는 ID를 찾아야 된다고 생각함... 바보)
    최적화 코드를 보고 ANIMAL_INS 테이블에 없는 것만 알면 되기 때문에 ANIMAL_OUTS 기준으로만 JOIN을 하면 만족하는 것을 알 수 있다.

GitHub

https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/3/59042.%E2%80%85%EC%97%86%EC%96%B4%EC%A7%84%E2%80%85%EA%B8%B0%EB%A1%9D%E2%80%85%EC%B0%BE%EA%B8%B0

profile
'The best way to get started is to quit talking and begin doing.'

0개의 댓글