ROWNUM을 이용한 데이터 기본동작
※ ROWNUM은 DataBase에 저장되지 않는 의사컬럼으로 참조만 되는 컬럼이다.
※ ROWNUM = 1은 사용가능하지만 ROWNUM = N (N > 1), ROWNUM > N (N > 1)은 동작하지 않는다.
아래문장은 정상적으로 작동한다.
SQL> WITH ROWNUM_TEST AS ( SELECT 1 AS C1, 'C' AS C2, 101 AS C3 FROM DUAL UNION ALL SELECT 2 AS C1, 'D' AS C2, 102 AS C3 FROM DUAL UNION ALL SELECT 3 AS C1, 'E' AS C2, 103 AS C3 FROM DUAL UNION ALL SELECT 4 AS C1, 'F' AS C2, 104 AS C3 FROM DUAL UNION ALL SELECT 5 AS C1, 'G' AS C2, 105 AS C3 FROM DUAL UNION ALL SELECT 6 AS C1, 'H' AS C2, 106 AS C3 FROM DUAL UNION ALL SELECT 7 AS C1, 'I' AS C2, 107 AS C3 FROM DUAL UNION ALL SELECT 8 AS C1, 'J' AS C2, 108 AS C3 FROM DUAL UNION ALL SELECT 9 AS C1, 'K' AS C2, 109 AS C3 FROM DUAL UNION ALL SELECT 10 AS C1, 'L' AS C2, 110 AS C3 FROM DUAL ) SELECT * FROM ( SELECT * FROM ROWNUM_TEST ORDER BY C1 ) WHERE ROWNUM >=1 AND ROWNUM <=5; C1 C2 C3 ---- ---- ---- 1 C 101 2 D 102 3 E 103 4 F 104 5 G 105 5 rows selected.
아래문장은 정상적으로 작동하지 않는다.
SQL> WITH ROWNUM_TEST AS ( SELECT 1 AS C1, 'C' AS C2, 101 AS C3 FROM DUAL UNION ALL SELECT 2 AS C1, 'D' AS C2, 102 AS C3 FROM DUAL UNION ALL SELECT 3 AS C1, 'E' AS C2, 103 AS C3 FROM DUAL UNION ALL SELECT 4 AS C1, 'F' AS C2, 104 AS C3 FROM DUAL UNION ALL SELECT 5 AS C1, 'G' AS C2, 105 AS C3 FROM DUAL UNION ALL SELECT 6 AS C1, 'H' AS C2, 106 AS C3 FROM DUAL UNION ALL SELECT 7 AS C1, 'I' AS C2, 107 AS C3 FROM DUAL UNION ALL SELECT 8 AS C1, 'J' AS C2, 108 AS C3 FROM DUAL UNION ALL SELECT 9 AS C1, 'K' AS C2, 109 AS C3 FROM DUAL UNION ALL SELECT 10 AS C1, 'L' AS C2, 110 AS C3 FROM DUAL ) SELECT * FROM ( SELECT * FROM ROWNUM_TEST ORDER BY C1 ) WHERE ROWNUM >= 6 AND ROWNUM <= 10; C1 C2 C3 ---- ---- ---- 0 rows selected. ROWNUM C1 C2 C3 ------------ ---- ---- ---- 1 1 C 101 ==> ROWNUM >= 6 AND ROWNUM <= 10 조건에서 조회되지 않고 버려짐. 2 2 D 102 ==> 위의 행이 버려졌으므로 다시 ROWNUM은 1이 되고 조건에 의해 버려짐 3 3 E 103 ==> 이하 동일 4 4 F 104 5 5 G 105 6 6 H 106 7 7 I 107 8 8 J 108 9 9 K 109 10 10 L 110
위의 조회가 정상적으로 되려면 아래와 같이 조회한다.
SQL> WITH ROWNUM_TEST AS ( SELECT 1 AS C1, 'C' AS C2, 101 AS C3 FROM DUAL UNION ALL SELECT 2 AS C1, 'D' AS C2, 102 AS C3 FROM DUAL UNION ALL SELECT 3 AS C1, 'E' AS C2, 103 AS C3 FROM DUAL UNION ALL SELECT 4 AS C1, 'F' AS C2, 104 AS C3 FROM DUAL UNION ALL SELECT 5 AS C1, 'G' AS C2, 105 AS C3 FROM DUAL UNION ALL SELECT 6 AS C1, 'H' AS C2, 106 AS C3 FROM DUAL UNION ALL SELECT 7 AS C1, 'I' AS C2, 107 AS C3 FROM DUAL UNION ALL SELECT 8 AS C1, 'J' AS C2, 108 AS C3 FROM DUAL UNION ALL SELECT 9 AS C1, 'K' AS C2, 109 AS C3 FROM DUAL UNION ALL SELECT 10 AS C1, 'L' AS C2, 110 AS C3 FROM DUAL ) SELECT C1, C2, C3 FROM ( SELECT ROWNUM RN , T1.* FROM ( SELECT * FROM ROWNUM_TEST ORDER BY C1 ) T1 ) WHERE RN >= 6 AND RN <= 10; C1 C2 C3 ---- ---- ---- 6 H 106 7 I 107 8 J 108 9 K 109 10 L 110 5 rows selected.
'개발 > DataBase' 카테고리의 다른 글
[Oracle] Null Column 조회 성능개선 (0) | 2018.04.29 |
---|---|
[Oracle] WHERE절에 number, varchar2 형변환 우선순위 (1) | 2018.04.22 |
[Oracle]Decode 함수2 (0) | 2018.04.08 |
[Oracle] Decode 함수1 (0) | 2018.04.08 |
[Oracle] Regular Expression (0) | 2018.04.04 |