DB/쿼리 문제풀이
프로그래머스 ORACLE 오랜 기간 보호한 동물(1)
sshhhh
2023. 10. 6. 15:08
정답
/*
1.아직 입양을 못 간 동물 중,
2.가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요.
3.이때 결과는 보호 시작일 순으로 조회해야 합니다.
*/
SELECT A.NAME, A.DATETIME
FROM(
SELECT T1.NAME, T1.DATETIME --2
FROM ANIMAL_INS T1
LEFT JOIN ANIMAL_OUTS B
ON T1.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL --1
) A --서브쿼리
WHERE ROWNUM <= 3 --3
ORDER BY A.DATETIME
--FETCH FIRST 3 ROWS ONLY;
- FROM 절 안에서 사용되는 서브쿼리는 서브쿼리 결과를 하나의 가상 테이블로 취급하여
메인 쿼리의 FROM 절에서 사용하는 것
📌LEFT JOIN
- 조인 조건을 만족하는 행뿐만 아니라, 왼쪽 테이블의 모든 행을 결과에 포함
- 왼쪽 테이블의 모든 행이 결과에 포함되며, 오른쪽 테이블의 조건을 만족하는 경우에는 오른쪽 테이블의 해당 행이 결과에 포함됩니다.
- 만약 오른쪽 테이블의 조건을 만족하지 않는 경우에는 NULL 값으로 채워져 결과에 표시
<사용이유>
- 입양을 가지 못한 동물의 경우 "ANIMAL_OUTS" 테이블에 관련 정보가 없을 수 있기 때문입니다. 즉, "ANIMAL_OUTS" 테이블에 해당 동물의 입양 정보가 없는 경우에도 결과에 해당 동물의 보호 시작일을 포함시키기 위해서입니다.
- "ANIMAL_INS" 테이블의 모든 행을 포함하면서, 해당 동물의 입양 정보가 없는 경우에는 "ANIMAL_OUTS" 테이블의 정보는 NULL로 표시되어 결과에 포함됩니다. 이로써 "아직 입양을 가지 못한 동물 중, 가장 오래 보호소에 있었던 동물"을 찾는 목적을 충족할 수 있게 됩니다.