ROW_NUMBER
PARTITION 내에서 ORDER BY절에 의해 정렬된 순서를 기준으로 고유한 값을 반환
e.g.
SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) "테스트"
, ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP;
--==>>
/*
1 KING 5000 1981-11-17
2 FORD 3000 1981-12-03
3 SCOTT 3000 1987-07-13
4 JONES 2975 1981-04-02
5 BLAKE 2850 1981-05-01
6 CLARK 2450 1981-06-09
7 ALLEN 1600 1981-02-20
8 TURNER 1500 1981-09-08
9 MILLER 1300 1982-01-23
10 WARD 1250 1981-02-22
11 MARTIN 1250 1981-09-28
12 ADAMS 1100 1987-07-13
13 JAMES 950 1981-12-03
14 SMITH 800 1980-12-17
*/
SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) "테스트"
, ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP
ORDER BY ENAME;
--==>>
/*
12 ADAMS 1100 1987-07-13
7 ALLEN 1600 1981-02-20
5 BLAKE 2850 1981-05-01
6 CLARK 2450 1981-06-09
2 FORD 3000 1981-12-03
13 JAMES 950 1981-12-03
4 JONES 2975 1981-04-02
1 KING 5000 1981-11-17
11 MARTIN 1250 1981-09-28
9 MILLER 1300 1982-01-23
3 SCOTT 3000 1987-07-13
14 SMITH 800 1980-12-17
8 TURNER 1500 1981-09-08
10 WARD 1250 1981-02-22
*/
-- 번호는 급여를 기준으로 부여했지만 정렬은 이름 순
문자 기준 정렬도 가능
SELECT ROW_NUMBER() OVER(ORDER BY ENAME) "테스트"
, ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP
ORDER BY ENAME;
--==>>
/*
1 ADAMS 1100 1987-07-13
2 ALLEN 1600 1981-02-20
3 BLAKE 2850 1981-05-01
4 CLARK 2450 1981-06-09
5 FORD 3000 1981-12-03
6 JAMES 950 1981-12-03
7 JONES 2975 1981-04-02
8 KING 5000 1981-11-17
9 MARTIN 1250 1981-09-28
10 MILLER 1300 1982-01-23
11 SCOTT 3000 1987-07-13
12 SMITH 800 1980-12-17
13 TURNER 1500 1981-09-08
14 WARD 1250 1981-02-22
*/
부서 번호가 20번인 사원에 번호 부여
SELECT ROW_NUMBER() OVER(ORDER BY ENAME) "테스트"
, ENAME "사원명", SAL "급여", HIREDATE "입사일"
FROM EMP
WHERE DEPTNO = 20
ORDER BY ENAME;
--==>>
/*
1 ADAMS 1100 1987-07-13
2 FORD 3000 1981-12-03
3 JONES 2975 1981-04-02
4 SCOTT 3000 1987-07-13
5 SMITH 800 1980-12-17
*/
※ 게시판의 게시물 번호를 SEQUENCE(오라클) 나 IDENTITY(MSSQL)를 사용하게 되면 게시물을 삭제했을 경우, 삭제한 게시물의 자리에 다음 번호를 가진 게시물이 등록되는 상황이 발생 이는 보안성 측면이나 미관성 바람직하지 않기에 ROW_NUMBER()의 사용을 고려해 볼 수 있다. 관리의 목적으로 사용할 때에는 SEQUENCE 나 IDENTITY를 사용하지만 단순히 게시물을 목록화하여 사용자에게 리스트 형식으로 보여줄 때에는 사용하지 않는 것이 바람직
시퀀스 생성
CREATE SEQUENCE SEQ_BOARD -- 기본적인 시퀀스 생성 구문
START WITH 1 -- 시작값
INCREMENT BY 1 -- 증가값
NOMAXVALUE -- 최대값
NOCACHE; -- 캐시사용여부
시퀀스 삭제
DROP SEQUENCE SEQ_BOARD;
테이블에 데이터 입력하면서 시퀀스 사용하기
INSERT INTO TBL_BOARD VALUES
(SEQ_BOARD.NEXTVAL, '풀숲', '전 풀숲에 있어요')
부족하거나 잘못된 내용이 있을 경우 댓글 달아주시면 감사하겠습니다.
이 글에 부족한 부분이 존재할 경우 추후에 수정될 수 있습니다.
'SQL > Oracle' 카테고리의 다른 글
프로젝트 DB 설계에 관하여 (0) | 2023.04.03 |
---|---|
29. 중첩 그룹함수 / 분석함수 (0) | 2022.03.12 |
28. HAVING (0) | 2022.03.12 |
27. CUBE (0) | 2022.03.12 |
26. ROLLUP, GROUPING (0) | 2022.03.12 |