예시 테이블: ANIMAL_INS
ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
| A399552 |
Dog |
2013-10-14 15:38:00 |
Normal |
Jack |
Neutered Male |
| A403564 |
Dog |
2013-11-18 17:03:00 |
Normal |
Anna |
Spayed Female |
| … |
… |
… |
… |
… |
… |
Oracle 11g 기준 – 최근 1행 조회
SELECT DATETIME
FROM (
SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC
)
WHERE ROWNUM = 1;
- ROWNUM = 1은 정렬된 결과에서만 의미가 있으므로 반드시 서브쿼리 사용!
최근 5행 조회 (최신순)
SELECT *
FROM (
SELECT * FROM ANIMAL_INS ORDER BY DATETIME DESC
)
WHERE ROWNUM <= 5;
- 가장 최근 입소한 5마리 동물 정보 확인 가능
불가능 코드
SELECT *
FROM ANIMAL_INS
WHERE ROWNUM >= 1 AND ROWNUM <= 5;
Oracle의 ROWNUM은 평가 시점에서 부여되므로, 이런 조건은 올바르게 작동하지 않음.
Oracle 12c 이상이라면?
-- 가장 최근 1마리
SELECT *
FROM ANIMAL_INS
ORDER BY DATETIME DESC FETCH FIRST 1 ROW ONLY;
-- 최근 1~5마리
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY DATETIME DESC) AS rn FROM ANIMAL_INS
)
WHERE rn BETWEEN 1 AND 5;
정리
상황Oracle 11g 방법Oracle 12c 이상 방법
| 최근 1건 |
서브쿼리 + ROWNUM = 1 |
FETCH FIRST 1 ROW ONLY |
| 최근 N건 |
서브쿼리 + ROWNUM <= N |
FETCH FIRST N ROWS ONLY 또는 ROW_NUMBER |