답변:
SQL Server 2005 이상에서는 ROW_NUMBER 함수를 사용할 수 있습니다 . 예.
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive
SQL Server 2012 이상에는 다음 구문이 추가되었습니다.
SELECT *
FROM Sales.SalesOrderHeader
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
LINQ to SQL은 ROW_NUMBER 윈도우 함수를 사용하여이 작업을 수행합니다.
SELECT a,b,c FROM
(SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number
FROM Table) t0
WHERE to.row_number BETWEEN 1000 and 1100;
이 작품,하지만 ORDER BY에서 ROW_NUMBER을 제조 할 필요가 있습니다 쿼리 결과는 서버 측과 원인 성능 문제에 분류된다. 인덱스가 ORDER BY 요구 사항을 충족 할 수있는 경우에도 쿼리는 결과 반환을 시작하기 전에 1000 개의 행을 계산해야합니다. 너무 자주 개발자는 이것을 잊어 버리고 5mil 행 테이블에 페이지 매김 제어를 던지고 첫 페이지가 마지막 페이지보다 훨씬 빨리 반환되는 이유를 궁금해합니다.
그럼에도 불구하고 ROW_NUMBER ()를 사용하는 것은 정렬을 피할 경우 사용의 용이성과 좋은 성능 사이의 최상의 균형 일 것입니다 (ORDER BY 조건은 인덱스로 충족 될 수 있음).
이거 한번 해봐:
select * from [Table-Name] order by [Column-Name]
offset [Skip-Count] rows
FETCH NEXT [Take-Count] rows only
예:
select * from Personals order by Id
offset 10 rows --------->Skip 10
FETCH NEXT 15 rows only --------->Take 15
이 작업을 수행:
LINQ to SQL 데이터 컨텍스트에서 .Skip (1000) .Take (100)를 실행하고 SQL 출력을 확인합니다. 설명하는 것을 수행하는 SQL 문을 생성합니다.
우아하지는 않지만 작업이 완료됩니다.
아니요,하지만 MySQL의 LIMIT 절 (Stack Overflow 링크)을 에뮬레이션 하여 동일한 결과를 얻을 수 있습니다.