본문 바로가기
DB & SQL

Oracle ROWNUM

by pms93 2024. 7. 10.

[ ROWNUM ]

 : 조회 결과 순으로 ROWNUM을 부여한다. 같은 레벨에서 ORDER BY와 함께 사용 시 원하지 않는 결과가 나올 수 있다. 이러한 경우는 subQuery로 처리하여 해결이 가능하다.

 

& ORDER BY없이 ROWNUM 조회 시

SELECT
	ROWNUM,
	B.*
FROM
	DEPT A
JOIN
	EMP B
ON
	A.DEPTNO = B.DEPTNO;

조회 결과 순으로 ROWNUM이 적용된다.

 

& ORDER BY, ROWNUM 함께 사용. 

SELECT
	ROWNUM,
	B.*
FROM
	DEPT A
JOIN
	EMP B
ON
	A.DEPTNO = B.DEPTNO
ORDER BY
	EMPNO;

ORDER BY가 적용된 결과로 ROWNUM이 적용되고 있지 않는 모습

 

& subQuery를 통해 ORDER BY가 적용 된 상태로 ROWNUM 적용

SELECT
	ROWNUM,
	A.*
FROM
(
	SELECT
		B.*
	FROM
		DEPT A
	JOIN
		EMP B
	ON
		A.DEPTNO = B.DEPTNO
	ORDER BY
		EMPNO
) A;

ORDER BY가 적용된 레코드 순으로 ROWNUM이 적용되고 있다.

 

& ORDER BY로 정렬하고자 하는 데이터가 중복되지 않는다면 RANK() 함수를 통해서 subQuery로 처리하지 않고 ROWNUM을 적용시킨 효과를 가져올 수 있다.

SELECT
	RANK() OVER(ORDER BY EMPNO),
	B.*
FROM
	DEPT A
JOIN
	EMP B
ON
	A.DEPTNO = B.DEPTNO;

위 subQuery 처리를 통해 ROWNUM을 적용시킨 결과와 동일하다.

 

단, ORDER BY에 명시된 컬럼의 데이터가 중복 가능성이 있다면 해당 함수로는 ROWNUM을 대체 할 수 없다. (자세한 내용은 RANK(), DENSE RANK() 참조)

'DB & SQL' 카테고리의 다른 글

Oracle Stored Procedure 1장(프로시저 생성 및 저장)  (0) 2024.07.10
Oracle ROW_NUMBER() OVER()  (2) 2024.07.10
Oracle XML  (0) 2024.06.26
Oracle JSON  (0) 2024.06.26
Transaction과 ACID표준  (0) 2023.01.31