문제 : https://programmers.co.kr/learn/courses/30/lessons/59044
ANIMAL_INS 테이블에는 있지만 ANIMAL_OUTS 에 없는 동물 중 보호기간이 가장 오래된 동물의 TOP 3를 오래된 순으로 조회하는 문제이다.
TOP 3 를 조회하는 두가지 방법을 소개한다!
첫번째 방법 - LEFT JOIN + 서브쿼리
SELECT NAME, DATETIME
FROM (SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID(+)
AND B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME)
WHERE ROWNUM < 4;
ANIMAL_INS를 기준으로 LEFT JOIN 한다 (B.ANIMAL_ID (+) 가 A를 기준으로 LEFT OUTER JOIN 한다는 뜻)
TOP 3만 출력하기 위해 ROWNUM < 4를 WHERE절에 써줘야 하기때문에 FROM 에 서브쿼리를 넣어 미리 DATETIME으로 ORDER 한 튜플들을 SELECT 한 후에 그 중 3개만 다시 SELECT 한다
두번째 방법 - FETCH 이용하기
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID(+)
AND B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
FETCH FIRST 3 ROWS ONLY;
다른 조건절은 위와 같지만, 여기서는 WHERE 절 안에 쓰는 것이 아니라 FETCH FIRST 3 ROWS ONLY를 사용해 TOP 3 를 뽑는다.
'개발 > database' 카테고리의 다른 글
[Oracle] programmers - 이름에 el이 들어가는 동물 찾기 (0) | 2021.08.05 |
---|---|
[Oracle] programmers - 보호소에서 중성화한 동물 (0) | 2021.08.05 |
[Oracle] programmers - 없어진 기록 찾기 (0) | 2021.08.05 |
[programmers]sql-입양 시각 구하기(1) (0) | 2021.02.26 |
[programmers]sql-Null 처리하기 (0) | 2021.02.26 |