C1 C2 C3
----- -- ---------
1 C 101
2 D 102
3 E 103
4 F 104
5 G 105
6 H 106
7 I 107
8 J 108
9 K 109
10 L 110
-- SQL[1]
SELECT *
FROM (SELECT *
FROM t1
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
-- SQL[2]
SELECT *
FROM (SELECT *
FROM t1
ORDER BY c1)
WHERE ROWNUM >= 6
AND ROWNUM <= 10;
-- 데이터 추출 안됨.
SQL[2]에서 데이터가 추출되지 않는 이유는?
조건에 해당하는 데이터를 추출하면서 나오는 데이터에 차례대로 ROWNUM 순번을 부여함.
C1 | ROWNUM | ROWNUM 조건 | 결과 데이터 |
---|---|---|---|
1 | 1 | ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함. | 1 |
1 | ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스. | ||
2 | 2 | ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함. | 1, 2 |
1 | ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스. | ||
3 | 3 | ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함. | 1, 2, 3 |
1 | ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스. | ||
4 | 4 | ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함. | 1, 2, 3, 4 |
1 | ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스. | ||
5 | 5 | ROWNUM >= 1 AND ROWNUM <= 5 만족하므로 결과 데이터로 포함. | 1, 2, 3, 4, 5 |
1 | ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스. | ||
6 | 6 | ROWNUM >= 1 AND ROWNUM <= 5 만족하지 않으므로 패스. 스톱 | |
1 | ROWNUM >= 6 AND ROWNUM <= 10 만족하지 않으므로 패스. |
결국 SQL[2] 쿼리에서는 ROWNUM 조건을 만족하는 데이터가 없으므로 계속 ROWNUM 1 을 부여하다 끝이 남.
SQL[2] 쿼리의 원래 의도대로 결과값을 추출해 내려면?
ROWNUM 조건을 주지 말고 조회된 데이터에 ROWNUM 을 먼저 부여한 후 조건을 설정해준다.
{code:sql} |
SELECT c1, c2, c3, RNUM
FROM (SELECT ROWNUM rnum,
t1.*
FROM (SELECT *
FROM t1
ORDER BY c1) T1
)
WHERE rnum >= 6 and rnum <= 10 ;