-
[Oracle] ROWNUM, 순번매기기 Order byDB/ORACLE 2023. 1. 16. 15:52
프로그래머스 문제를 푸는데 상위 N개의 레코드를 구하는 문제가 나왔다. (보호소에 가장 먼저 들어온 동물 조회)
mysql로 푼다면 order by로 정렬한 다음 LINIT 1;을 줘서 구하면 되는데, 오라클은 ROWNUM을 사용해야 된다. 한참 ROWNUM 안 보다가 오랜만에 보니 헷갈려서 정리하려 한다.
select name from ( select rownum, name from ANIMAL_INS order by datetime )where rownum < 2;
https://school.programmers.co.kr/learn/courses/30/lessons/59405?language=oracle
📑 ROWNUM이란?
시스템 함수를 사용하면 라인별 순번을 가져올 수 있다.
SELECT ROWNUM, AI.* FROM ANIMAL_INS AI;
위와 같이 사용할 경우 위에서부터 순번이 매겨지는데 특정 조건으로 정렬되지 않은 경우 순번은 무의미하다.
📑 정렬된 데이터 순번 매기기
순번을 매기는 시스템 함수는 ROWNUM이고 정렬은 ORDER BY를 사용하면 되는데 ROWNUM과 ORDER BY를 같이 사용할 경우 매겨놓은 순번이 섞여버리는 현상이 발생한다.
SELECT ROWNUM, AI.* FROM ANIMAL_INS AI ORDER BY DATETIME;
WHY? 왜 그런 현상이 발생할까? 그 이유는 쿼리문의 진행순서 때문이다.
쿼리문은 FROM - WHERE - GROUP BY - SELECT - ORDER BY 순으로 진행된다. 때문에 SELECT 진행되었을 때 ROWNUM은 이미 매겨진 상태이고 순번이 매겨진 상태에서 ORDER BY로 다시 정렬을 하다 보니 순번이 뒤죽박죽일 수 밖에 없는 것이다.
📑 서브쿼리에서 먼저 정렬 후 순번 매기기
따라서 아래와 같이 서브쿼리에서 먼저 순번을 매긴 다음에 메인 쿼리문에 where 조건을 줘서 min, max 값을 가져올 수 있다.
select name from ( select rownum, name from ANIMAL_INS order by datetime )where rownum < 2;
반응형'DB > ORACLE' 카테고리의 다른 글
[ORACLE] NOT IN vs NOT EXISTS 차이점 (0) 2023.03.07 [ORACLE] SCOTT 계정 활성화하기 (0) 2023.03.03 [ORACLE] SQL Developer 설치, 계정 생성 (0) 2023.02.16 [Oracle] 오라클 11g Express Edition(XE) 다운, 계정 생성 (0) 2023.02.16 [OARCLE] PL/SQL이란? 특징과 필요성 (0) 2023.01.25