수색…


소개

다양한 버전의 SQL Server에서 행 오프셋 및 페이징

통사론

  • SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH 다음 10 행만;

공통 테이블 식과 함께 ROW_NUMBER를 사용하여 페이지 매김

SQL Server 2008

ROW_NUMBER 함수는 결과 집합의 각 행에 증가 숫자를 할당 할 수 있습니다. BETWEEN 연산자를 사용하는 공통 테이블 식과 결합하여 결과 집합의 '페이지'를 만들 수 있습니다. 예 : 페이지 1은 결과 1-10, 페이지 2는 결과 11-20, 페이지 3은 결과 21-30 등을 포함합니다.

WITH data
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY name) AS row_id,
        object_id,
        name, 
        type,
        create_date
    FROM sys.objects
)
SELECT *
FROM data
WHERE row_id BETWEEN 41 AND 50

참고 : WHERE 절에서 ROW_NUMBER 를 다음과 같이 사용할 수 없습니다.

SELECT object_id,
    name,
    type,
    create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50

이 방법이 더 편리 할지라도 SQL Server는이 경우 다음 오류를 반환합니다.

메시지 4108, 수준 15, 상태 1, 줄 6

창 함수는 SELECT 또는 ORDER BY 절에만 나타날 수 있습니다.

OFFSET FETCH로 페이지 매김

SQL Server 2012

OFFSET FETCH 절은 더 간결한 방식으로 페이지 매김을 구현합니다. N1 행 ( OFFSET 지정됨)을 건너 뛰고 다음 N2 행 ( FETCH 지정됨)을 리턴 할 수 있습니다.

SELECT *
FROM sys.objects
ORDER BY object_id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY

결정적 결과를 제공하려면 ORDER BY 절이 필요합니다.

내부 쿼리가있는 페이지 매김

이전 버전의 SQL Server에서 개발자는 TOP 키워드와 결합 된 이중 정렬을 사용하여 페이지의 행을 반환해야했습니다.

 SELECT TOP 10 *
 FROM
 (
    SELECT
    TOP 50 object_id,
        name,
        type,
        create_date
    FROM sys.objects
    ORDER BY name ASC
) AS data
ORDER BY name DESC

내부 쿼리는 name 정렬 된 처음 50 개의 행을 반환합니다. 그런 다음 외부 쿼리가이 50 개의 행의 순서를 반대로하고 상위 10 개의 행을 선택합니다 (역전 전에 그룹에서 마지막 10 개의 행이됩니다).

다양한 버전의 SQL Server에서 페이징

SQL Server 2012/2014


DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM OrderDetail
ORDER BY OrderId
OFFSET (@PageNumber - 1) * @RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY

SQL Server 2005 / 2008 / R2


DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (
    SELECT OrderId, ProductId, ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
    FROM OrderDetail) AS OD
WHERE OD.RowNum BETWEEN ((@PageNumber - 1 ) * @RowsPerPage) + 1
AND @RowsPerPage * @PageNumber

SQL Server 2000


DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (SELECT TOP (@RowsPerPage) OrderId, ProductId
        FROM (SELECT TOP ((@PageNumber)*@RowsPerPage) OrderId, ProductId
                FROM OrderDetail
                ORDER BY OrderId) AS OD
    ORDER BY OrderId DESC) AS OD2
ORDER BY OrderId ASC

ORDER BY OFFSET 및 FETCH NEXT를 사용하는 SQL Server 2012/2014

다음 10 개의 행을 얻으려면이 쿼리를 실행하십시오.

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

그것을 사용할 때 고려해야 할 핵심 사항 :

  • ORDER BYOFFSETFETCH 절을 사용해야합니다.
  • FETCH 절에는 OFFSET 절이 필수입니다. 당신은 사용할 수 없다 ORDER BY ... FETCH .
  • TOP 는 동일한 조회 표현식에서 OFFSETFETCH 와 결합 될 수 없습니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow