문제에서 원하는 것은
1. 입양을 아직 못 간 동물이어야 하고
2. 가장 오래 보호소에 있던 동물이어야 하며
3. 3마리만 조회가 되어야 한다.
따라서 1번부터 확인 차근차근 풀어가 보도록 하겠다.
ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블을 보고 1,2,3번을 차근차근 sql로 바꾸어 보겠다.
일단 1. 입양을 못간 동물이란 것은 ANIMAL_INS 테이블의 보호 시작일은 존재하는 동물이어야 하며, ANIMAL_OUTS 테이블에서 입양일이 존재하지 않으면 입양을 못 가고 아직 보호소에 남아 있다는 뜻으로 해석된다.
따라서 두개의 테이블을 JOIN 해야 하며 이때 ANIMAL_INS 테이블을 기준으로 LEFT JOIN을 하여 ANIMAL_INS 테이블에 데이터가 존재하지만 ANIMAL_OUTS 테이블에 존재하지 않아도 NULL로 우리가 원하는 데이터들이 전부 출력될 것이다.
이를 SQL로 바꾸면
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.DATETIME is NULL
이렇게 될것이다.
ON 뒷부분은 JOIN을 하기 위해선 두 개의 테이블의 공통점이 필요하기 때문에 ANIMAL_OUTS 테이블에서 외래키로 사용 중인 ANIMAL_ID속성을 사용하여 JOIN을 한 것이다.
또한 WHERE절은 아까 말했듯이 입양일이 없어야만 보호소에 아직 존재하는 동물이므로 입양일이 NULL인 동물만을 조건으로 지정하였다.
이제 2. 그중 가장 오래 보호소에 있던 동물은 보호 시작일이 가장 오래된 동물이라고 볼 수 있다.
따라서
ORDER BY A.DATETIME
ORDER BY절을 사용하여 보호 시작일을 가지고 정렬을 하였다.
마지막으로 3. 3마리만 조회가 되어야 한다. 는
LIMIT 3;
LIMIT로 3을 주어서 3개만 출력하게 할 수 있다.
이제 이름과 보호 시작일을 조회하라 하였기 때문에 이를 전부 붙여서 작성하면
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.DATETIME is NULL
ORDER BY A.DATETIME ASC LIMIT 3;
이렇게 적을 수 있을 것이다.
'코딩테스트' 카테고리의 다른 글
프로그래머스 오랜 기간 보호한 동물(2) (0) | 2023.09.02 |
---|---|
프로그래머스 있었는데요 없었습니다 (0) | 2023.09.02 |
백준 돌 게임7 (9661번) (0) | 2022.08.31 |
백준 돌 게임6(9660번) (0) | 2022.08.31 |
백준 a^b(10827번) (0) | 2022.08.31 |