level3_오랜 기간 보호한 동물(1)

2024. 6. 17. 22:52MYSQL_알고리즘(코딩테스트)/level3

 

 

내가 제출한 코드

SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
    LEFT JOIN ANIMAL_OUTS O
    ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME LIMIT 3;

 

LEFT JOIN을 사용한 이유

- 모든 동물을 기준으로 한다.

    - ANIMAL_INS 테이블의 모든 동물을 기준으로 ANIMAL_OUTS 테이블과 결합한다.

        - 이렇게 하면 입양되지 않은 동물(ANIMAL_OUTS에 없는 동물)을 쉽게 식별할 수 있다.

- 입양되지 않은 동물 필터링

    - LEFT JOIN 결과에서 ANIMAL_OUTS 테이블에 일치하는 행이 없는 경우. 즉, O.ANIMAL_ID가 NULL인 경우를 필터링 하여 입양되지 않은 동물을 찾는다. (WHERE절)

 

 

 

 

 

 

다른 블로그 참고한 다른코드

SELECT NAME, DATETIME 
FROM ANIMAL_INS A
WHERE NOT EXISTS (
    SELECT ANIMAL_ID 
    FROM ANIMAL_OUTS B 
    WHERE A.ANIMAL_ID = B.ANIMAL_ID
)
ORDER BY DATETIME 
LIMIT 3;

 

- WHERE NOT EXISTS (SELECT ANIMAL_ID FROM ANIMAL_OUTS B WHERE A.ANIMAL_ID = B.ANIMAL_ID)

    - 서브쿼리를 사용하여 ANIMAL_OUTS 테이블에서 현재 ANIMAL_INS 테이블의 동물이 존재하는지 확인한다.

    - WHERE A.ANIMAL_ID = B.ANIMAL_ID 조건을 사용하여 A 테이블의 ANIMAL_ID와 B 테이블의 ANIMAL_ID가 일치하는지 확인한다.

    - NOT EXISTS는 서브쿼리의 결과가 존재하지 않는 경우, 즉 ANIMAL_OUTS 테이블에 해당 동물이 존재하지 않는 경우 참을 반환한다.

    - 결과적으로, ANIMAL_OUTS 테이블에 존재하지 않는 ANIMAL_ID를 가진 행만 선택된다. 이는 아직 입양되지 않은 동물을 의미한다.