페이지화 쿼리에서 ROWNUM은 어떻게 작동합니까?
따라서 Oracle DB에서 행 범위를 선택하고자 합니다.테이블에 수백만 개의 행이 있고 결과를 사용자에게 페이지로 전송하고 싶기 때문에 이 작업을 수행해야 합니다(클라이언트 측에서 이 작업을 수행하는 다른 방법을 알고 있다면 JavaFX를 사용하고 있지만 모든 데이터를 네트워크를 통해 전송하여 클라이언트 측에서 페이지로 전송하는 것은 좋지 않다고 생각합니다).
SQL ROWNUM이라는 게시물을 읽은 후 다음과 같은 질문이 있습니다.
Select * From (Select t.*, rownum r from PERSON t) Where r > 100 and r < 110;
그100
그리고.110
단지 예시일 뿐입니다.애플리케이션에서 저는 하한선을 요청하고 10_000의 크기를 추가하여 다음 10_000 행을 가져옵니다.
이제 결과에 행 번호 열이 나타나고 보기를 원하지 않습니다.SQL에 대한 경험이 많지 않기 때문에 다음과 같은 질문을 합니다.
이유(SO에서 검색하기 전까지는 이것이 첫 번째 시도였습니다.)
Select * From Person Where rownum > 100 and rownum < 110;
0 행을 반환합니까?왜 이런 일을 할 수 있는 간단한 방법이 없을까요?
Select ... FROM ... WHERE rownum BETWEEN lowerBound AND upperBound
?제거하는 방법
r
결과 값의 열?SQL에서 SELECT * [열 A 제외]를 사용하여 열을 테이블 A에서 제외하시겠습니까?보기나 임시 테이블을 만들어야 할 것 같은데, 제 질문을 고려할 다른 방법이 있나요?올바른 페이지 설정을 보장합니까?일관된 페이지 번호를 얻기 위해 고유한 것으로 값을 주문해야 한다는 이 기사 섹션 "ROWNUM을 사용한 페이지 번호"를 읽었습니다.
rownum
확인할 수 있다면).사용 목적에 어긋나지 않습니까?FIRST_ROWS(N)
?
너무 심하지 않았으면 좋겠다, 따로 질문을 나눌 수도 있겠지만, 밀접한 관련이 있는 만큼 무너지는 것이 관련이 있다고 봅니다.
4가지 질문이 있는데, 모두 ROWNUM의 사용법과 기능에 관한 것입니다.저는 각각의 질문에 하나씩 대답할 것입니다.
왜 (SO에서 검색하기 전까지 첫 시도였습니다) * 사람에서 행 번호 > 100 및 행 번호 < 110을 선택하고 0 행을 반환합니까?
여기서 ROWNUM과 페이지화에 대한 Thomas Kyte의 좋은 설명입니다.
ROWNUM 값은 쿼리의 술어 단계를 통과한 후 쿼리가 정렬 또는 집계를 수행하기 전에 행에 할당됩니다.또한 ROWNUM 값은 할당된 후에만 증가하므로 다음 쿼리는 행을 반환하지 않습니다.
select *
from t
where ROWNUM > 1;
ROWNUM > 1은 첫 번째 행에 대해 참이 아니기 때문에 ROWNUM은 2로 진행되지 않습니다.따라서 ROWNUM 값이 1보다 큰 경우는 없습니다.
Select...와 같은 간단한 작업 방법이 없는 이유시작...하한과 상한 사이의 행 번호는 어디입니까?
네, 있습니다.Oracle 12c 이후에는 새로운 상위 n개 행 제한 기능을 사용할 수 있습니다.여기서 제 대답을 보세요.
예를 들어, 아래 쿼리는 직원들을 4번째로 높은 급여에서 7번째로 높은 급여 사이로 오름차순으로 반환합니다.
SQL> SELECT empno, sal
2 FROM emp
3 ORDER BY sal
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
EMPNO SAL
---------- ----------
7654 1250
7934 1300
7844 1500
7499 1600
SQL>
결과 값에서 r 열을 제거하는 방법은 무엇입니까?
에 에.select *
외부 쿼리에 필요한 열 이름을 나열합니다.쿼리를 자주 사용하는 경우 보기를 만드는 것은 단순한 일회성 작업입니다.
또는 에서 NOPRINT 명령을 사용할 수 있습니다.표시하지 않을 열 이름은 표시되지 않습니다.그러나 SQL*Plus에서만 작동합니다.
예를들면,
COLUMN column_name NOPRINT
예를들면,
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;
DEPTNO
----------
10
20
30
40
SQL>
올바른 페이지 설정을 보장합니까?
예, 페이지 번호 조회를 올바르게 작성한 경우.
예를들면,
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM t
ORDER BY val)
WHERE rownum <= 8)
WHERE rnum >= 5;
VAL
----------
3
3
4
4
4 rows selected.
SQL>
또는 위에 표시한 대로 12c의 새 행 제한 기능을 사용합니다.
여기에 몇 가지 좋은 예가 있습니다.
질문 2에 대한 답변: Oracle 12에서는 페이지 번호를 사용할 수 있습니다.
select owner, object_name, object_id
from t
order by owner, object_name
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
저는 보통 다음과 같은 질문을 작성합니다.
select *
from
(
select a.*, rownum as rn
from table_name a
where rownum <= 110
)
where rn > 100
언급URL : https://stackoverflow.com/questions/30321483/how-rownum-works-in-pagination-query
'programing' 카테고리의 다른 글
오류: 'brew link' 단계가 성공적으로 완료되지 않았습니다. (0) | 2023.07.25 |
---|---|
Oracle 캐스케이드 삭제 (0) | 2023.07.25 |
스프링 보안에서 현재 로그인한 사용자 개체를 가져오는 방법은 무엇입니까? (0) | 2023.07.25 |
마리아드브:MySQL 서버가 사라졌습니다. (0) | 2023.07.25 |
ADO.NET에서 Oracle을 호출할 때 여러 개의 선택 문 배치 (0) | 2023.07.20 |