ROWNUM과는 다르게 OVER에 파라미터를 전달하여 ROWNUMBUR를 적용할 기준을 정할 수 있다. 아래 두 사진의 차이점을 비교하여 ORDER BY / ROWNUM 혼용 사용과 ROW_NUMBER() OVER()의 차이를 알아보자.
1) ROW_NUMBER() OVER() 사용
SELECT
ROW_NUMBER() OVER(ORDER BY EMPNO) AS RN,
-- ROWNUM을 EMPNO가 ORDER BY된 결과로 적용해줘~ 로 보면 된다.
B.*
FROM
DEPT A
JOIN
EMP B
ON
A.DEPTNO = B.DEPTNO;
2) ORDER BY / ROWNUM 혼용 사용
SELECT
ROWNUM,
B.*
FROM
DEPT A
JOIN
EMP B
ON
A.DEPTNO = B.DEPTNO
ORDER BY
EMPNO;
두 쿼리의 결과를 보면 EMPNO Column으로 정렬이 된 것은 동일하나 ROWNUM이 다르게 적용 된 모습을 볼 수 있다.
일반적인 ORDER BY 사용법과 동일하게 특정 데이터들을 결과에서 우선시 할 수 있다.
SELECT
ROW_NUMBER() OVER(
ORDER BY
CASE
WHEN MGR = '7698' THEN
2
ELSE
1
END,
-- 각 행의 MGR이 7698일 경우 해당 행을 2순위, 아닐 경우 1순위로 정렬해줘~ 가 된다.
EMPNO
) AS RN,
B.*
FROM
DEPT A
JOIN
EMP B
ON
A.DEPTNO = B.DEPTNO;
OVER() 내에 ORDER BY와 함께 사용 할 수 있는 정렬 기준이 하나 더 있는데 PARTITION BY다. 정렬하고자 하는 컬럼 별로 ROWNUM을 따로 적용하고 싶을 경우 사용한다.
SELECT
ROW_NUMBER() OVER(
PARTITION BY
A.DEPTNO
ORDER BY
EMPNO
) AS RN,
B.*
FROM
DEPT A
JOIN
EMP B
ON
A.DEPTNO = B.DEPTNO;
SELECT
ROW_NUMBER() OVER(
PARTITION BY
A.DEPTNO
ORDER BY
CASE
WHEN MGR = '7566' THEN
1
WHEN MGR = '7839' THEN
2
ELSE
3
END
) AS RN,
B.*
FROM
DEPT A
JOIN
EMP B
ON
A.DEPTNO = B.DEPTNO
WHERE
MGR IS NOT NULL;
'DB & SQL' 카테고리의 다른 글
Oracle Stored Procedure 2장(지역변수 선언 및 프로세스) (0) | 2024.07.11 |
---|---|
Oracle Stored Procedure 1장(프로시저 생성 및 저장) (0) | 2024.07.10 |
Oracle ROWNUM (0) | 2024.07.10 |
Oracle XML (0) | 2024.06.26 |
Oracle JSON (0) | 2024.06.26 |