문제

어떻게는 페이징에 퍼지는 SQL(9.1)?내가 뭔가를 할 필요가와 같은 유사:

//MySQL
SELECT foo FROM table LIMIT 10, 10

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

도움이 되었습니까?

해결책 4

나는 코드로 페이징을했다. 루프에서 첫 번째 레코드를 건너 뜁니다.

나는 페이징을하기에 쉬운 방법을 만들었다 고 생각했지만, 널리 퍼져있는 SQL은 하위 쿼리의 순서 조항을 허용하지 않는 것 같습니다. 그러나 이것은 다른 DBS에서 작동해야합니다 (파이어 버드에서 테스트했습니다)

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

다른 팁

PSQL에서 테스트 된 쿼리 :

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

모든 N = No.의 레코드에 대해 한 번에 가져와야합니다. 및 K = N의 배수 (예 : n = 5; k = 0,5,10,15, ....)

우리는 페이징 필요 우리는 전달할 수 있는 현재 페이지 번호와 페이지의 크기(와 함께 몇 가지 추가 필터를 매개 변수)을 변수입니다.이후 선택 최고@작은 작동하지 않 MS SQL,우리가 만드는 일시적 또는 변수 테이블을 각 행의 기본 키 id 할 수 있는 나중에 필터링에 대한 원하는 페이지 번호 및 크기입니다.

**참고가 있는 경우 GUID 를 기본 키 또는 화합물을 키,당신은 단지를 변경해야 할 객체 id 에 임시에 테이블을 고유 식별자 또는 추가 키를 열다.

아래쪽 이것은 여전히 삽입하는 모든 결과로 임시 테이블,하지만 적어도 그것은 단지 키를 사용합니다.이 작품에서 MS SQL 하지만,일할 수 있어야 합니다 모든 DB 최소화 되었습니다.

선@page_number int,@작 int--추가 검색 파라미터

을 만들어 임시 테이블과 함께 id 열 id
--의 기록할 선택합니다.이것은 메모리
--테이블,경우의 수 행할 것을 삽입하는 크
--10,000,다음 사용해야 합니다 임시 테이블에서 tempdb
-대신.이렇게 하려면 사용
--테이블 생성#temp_table(row_num int ID(1,1),개체 id int)
--변경을 참조하는 모든 것@temp_table 하#temp_table
선@temp_table 테이블(int row_num ID(1,1),개체 id int)

--삽입으로 임시와 테이블의 id 를 기록
우리가 원하는 돌아갑니다.그것의 중요한지 확인하여 순서
--반영하기 위해 레코드를 반환하도록 row_num
--값 설정을 올바른 순서와 우리가 선택
--정확한 기록에 기초한 페이지
에 삽입@temp_table (모든 요청에 필)

/*예:선택하는 삽입 기록으로 임시 테이블
선택 personid
에서 사람이 (NOLOCK)
내부 조도 (NOLOCK)에서는 정도입니다.personid= 사람입니다.personid
가 사람입니다.성=@last_name
주문 사람입니다.성 asc, 사람입니다.firsname asc
*/

--을 얻을 총 수의 행 우리가 일치하는
선@total_rows int
SET@total_rows= @ROWCOUNT
-계산 페이지의 총 수에 따라 번호
--행하는 일치하고 페이지 크기로 전달된 매개 변수
선언 @total_pages int
--추가@작-1 의 총 수 행하는
-계산의 총 수 페이지입니다.이 때문에 sql
--라운드로 항상 아래의 사단을 위해 정수
SET@total_pages= (@total_rows+@작-1)/ @작

--돌아서 결과 집 우리는 관심이여 가입
--다시@temp_table 및 필터링하여 row_num
/*예:선택하는 데이터를 반환합니다.는 경우 삽입이 이루어졌
제대로,다음 당신은 항상해야 합류한 테이블 을 포함하는
행 돌아 하는 모든 요청에 필 열에 @temp_table

사람을 선택합니다.*
에서 사람이 (NOLOCK)내부 조@temp_table tt
에 사람입니다.personid= tt.개체 id
*/
--행만 반환되는 페이지에서 우리는 관심이
--및 순서에 의해 row_num 의 열@temp_table 하는지 확인
--우리가 선택한 올바른 기록
는 tt.row_num < (@작*@page_number)+1
과 tt.row_num>(@작* @page_number)-@작
주문 Tt 에 의하여.row_num

MS SQL 에서도이 문제에 직면 해 있습니다. 내가하는 일은 최종 쿼리 결과 (또는 때로는 전체 필드 목록)에 대한 키를 ID 열이있는 온도 테이블에 삽입하는 것입니다 ... 그런 다음 나는 내가 원하는 범위 외부의 모든 내용 테이블에서 삭제합니다 ... 그런 다음 사용합니다. 키와 원본 테이블에 대한 조인, 내가 원하는 항목을 되 찾으십시오. 이것은 당신이 멋진 독특한 키를 가지고 있다면 작동합니다. 그렇지 않다면 ... 그 자체로 디자인 문제입니다.

성능이 약간 더 나은 대안은 삭제 단계를 건너 뛰고 최종 조인에서 행 번호를 사용하는 것입니다. 또 다른 성능 향상은 최소한 최소한 원인의 끝을 지나서 물건을 가져갈 필요가 없도록 최고 연산자를 사용하는 것입니다.

그래서 ... 의사 코드에서 ... 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top