Pervasive SQL에서 페이징


0

Pervasive SQL (버전 9.1)에서 페이징을 수행하는 방법은 무엇입니까? 비슷한 것을해야합니다 :

//MySQL 
SELECT foo FROM table LIMIT 10, 10 

그러나 오프셋을 정의하는 방법을 찾을 수 없습니다.

0

결국 코드에서 페이징을 수행했습니다. 루프의 첫 번째 레코드는 건너 뜁니다.

나는 페이징을하기위한 쉬운 방법을 만들었다 고 생각했지만 퍼베이시브 SQL은 서브 쿼리에서 순서 절을 허용하지 않는다.그러나 다른 DB를 작동해야 PSQL에서

select * 
from (select top [rows] * from 
(select top [rows * pagenumber] * from mytable order by id) 
order by id desc) 
order by id 

0

MS SQL에서도이 문제가 발생합니다 ... 한계 또는 rownumber 함수가 없습니다. 내가 할 일은 최종 질의 결과 (또는 때로는 전체 필드 목록)를위한 키를 ID 열이있는 임시 테이블에 삽입하는 것입니다 ... 그런 다음 임시 테이블에서 원하는 범위 밖의 모든 것을 삭제합니다. 키와 원본 테이블에 대한 조인을 사용하여 원하는 항목을 다시 가져옵니다. 이것은 고유 한 고유 키가있는 경우 작동합니다. 그렇지 않으면 잘됩니다 ... 그 자체로 디자인 문제입니다.

약간 더 나은 성능의 대안은 삭제 단계를 건너 뛰고 최종 결합에서 행 번호 만 사용하는 것입니다. 또 다른 성능 향상은 TOP 연산자를 사용하는 것입니다. 그래야 최소한 원하는 것을 끝내야 할 필요가 없습니다.

의사 코드에

그래서 ... 항목 80-89을 잡기 위해 ...

create table #keys (rownum int identity(1,1), key varchar(10)) 

insert #keys (key) 
select TOP 89 key from myTable ORDER BY whatever 

delete #keys where rownumber < 80 

select <columns> from #keys join myTable on #keys.key = myTable.key 

1
우리의 페이징 우리가 현재의 페이지 번호와 페이지 크기에 통과 할 수 있다는 필요한

는 (함께 일부 추가 필터 매개 변수 포함)을 변수로 사용합니다. 최상위 select @page_size가 MS SQL에서 작동하지 않기 때문에 임시 또는 가변 테이블을 작성하여 각 행 기본 키에 나중에 원하는 페이지 번호 및 크기로 필터링 할 수있는 ID를 할당했습니다.

** GUID 기본 키 또는 복합 키가있는 경우 임시 테이블의 개체 ID를 고유 식별자로 변경하거나 추가 키 열을 테이블에 추가하기 만하면됩니다.

이 단점은 모든 결과를 임시 테이블에 삽입해야하지만 적어도 그 것은 키뿐입니다. 이것은 MS SQL에서 작동하지만, 최소한의 개조로 모든 DB에서 작동 할 수 있어야합니다.

선언 @page_number의 INT, INT를 @page_size - 여기 매개 변수

을 추가 검색을 추가 --create 식별 컬럼에 임시 테이블과 ID를 기록 --of
그 너는 선택할거야. 이것은 메모리에
--table이므로 삽입 할 행 수가
- 10,000보다 큰 경우 tempdb
--instead의 임시 테이블을 사용해야합니다. 이렇게하려면
DECLARE @temp_table 표 (ROW_NUM INT를 #temp_table하는 @temp_table하는
모든 참조를 변경 - 그리고
--create 표 #temp_table (ROW_NUM의 INT의 IDENTITY (1,1), OBJECTID의 int)를 사용 IDENTITY (1,1), objectid int) - 우리는 돌아가고 싶습니다 레코드의 ID를 사용하여 임시 테이블에 삽입 -

-
- 행 번호가
- 값이 올바른 순서로 설정되고 반환 할 레코드의 순서를 반영하여 페이지에 따라
- 올바른 레코드를 선택합니다. @temp_table (OBJECTID) INTO
INSERT

/* 예 : 선택 (NOLOCK)와 함께 사람으로부터
을 personid
SELECT 임시 테이블에 기록을 삽입 내부
는 정도에 (NOLOCK)이 학위를 가입 할 수 있습니다. personid = person.personid 이 person.lastname = @last_name 우리가
DECLARE 일치 person.lastname 오름차순, person.firsname 오름차순
*/

행의 총 수 --get BY
주문이 INT
SET를 @[email protected]_rows = @@ ROWCOUNT

가 @total_pages 선언 유사한
--rows의 개수와 파라미터로 전달 된 페이지 사이즈에 기초하여 페이지의 총 개수 값 int --calculate
--add @ page_size - 1에서 총 행 수
- 총 페이지 수를 계산하십시오. SQL
--alwasy 정수의 부문에 대한 내림 때문이다
SET의 @total_pages = (@total_rows + @page_size - 1)/우리가 참여하여 관심있는 결과 집합 --return @page_size


- @temp_table에 저장하고 row_num으로 필터링
/* 예 : 반환 할 데이터를 선택하십시오. 삽입이 제대로
를 수행 한 경우에, 당신은 항상 @temp_table

SELECT 사람에 OBJECTID 컬럼 을 반환
행을 포함하는 테이블 에 가입해야 . *
사람으로부터 함께 (NOLOCK) 내부는 person.personid = tt.objectid
ON @temp_table TT
가입하세요 */
--return 우리는의 ROW_NUM의 열을 기준으로
- 그리고 순서에 관심이있는 페이지 만 행
를 @page_size - tt.row_num가 < (@page_size @page_number *) + 1
AND tt.row_num> (@page_size * @page_number) - 우리 WHERE 올바른
레코드를 선택하고 있는지
을 할 @temp_table ORDER BY tt.row_num


2

테스트 쿼리 (나는 파이어 버드에 그것을 테스트) : 모든

select top n * 
from tablename 
where id not in(
select top k id 
from tablename 
) 

N = u는 한 번에 가져올 필요가 기록 헤아 렸어요. 및 k = n의 배수 (예 : n = 5, k = 0,5,10,15, ...)