Microsoft SQL Server
쪽수 매기기
수색…
소개
다양한 버전의 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 BY
는OFFSET
및FETCH
절을 사용해야합니다. -
FETCH
절에는OFFSET
절이 필수입니다. 당신은 사용할 수 없다ORDER BY
...FETCH
. -
TOP
는 동일한 조회 표현식에서OFFSET
및FETCH
와 결합 될 수 없습니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow