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로 표시되어 결과에 포함됩니다. 이로써 "아직 입양을 가지 못한 동물 중, 가장 오래 보호소에 있었던 동물"을 찾는 목적을 충족할 수 있게 됩니다.