Концепция реактивного программирования была введена Microsoft, затем библиотека была создана Netfilx. Здесь вы можете узнать больше о путешествии Netflix Rx
ОБНОВЛЕНИЕ Если вы используете SQL 2012, был добавлен новый синтаксис, чтобы сделать это действительно простым. См. Реализовать функциональность подкачки (пропустить / взять) с этим запросом.
Полагаю, наиболее элегантным является использование функции ROW_NUMBER (доступно из MS SQL Server 2005):
WITH NumberedMyTable AS
(
SELECT
Id,
Value,
ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber
FROM
MyTable
)
SELECT
Id,
Value
FROM
NumberedMyTable
WHERE
RowNumber BETWEEN @From AND @To
Почему бы не сделать два запроса:
select top(M+N-1) * from table into temp tmp_final with no log;
select top(N-1) * from tmp_final order by id desc;
Существует довольно простой метод для T-SQL
, хотя я не если вы пропускаете большое количество строк, убедитесь, что это эффективно до prendanda.
SELECT TOP numberYouWantToTake
[yourColumns...]
FROM yourTable
WHERE yourIDColumn NOT IN (
SELECT TOP numberYouWantToSkip
yourIDColumn
FROM yourTable
ORDER BY yourOrderColumn
)
ORDER BY yourOrderColumn
Если вы используете .Net, вы можете использовать следующее, например, для IEnumerable с вашими данными:
IEnumerable<yourDataType> yourSelectedData = yourDataInAnIEnumerable.Skip(nubmerYouWantToSkip).Take(numberYouWantToTake);
сзади, что вы получаете все данные из хранилища данных.
Найти идентификатор для строки N Затем получите верхние M строк с идентификатором, большим или равным этому
declare @N as int set @N = 2 declare @M as int set @M = 3 declare @Nid as int set @Nid = max(id) from (select top @N * from MyTable order by id) select top @M * from MyTable where id >= @Nid order by id
Что-то в этом роде ... но я сделал здесь некоторые предположения (например, вы хотите упорядочить по id)
@start = 3
@records = 2
Select ID, Value
From
(SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RowNum, ID,Value
From MyTable) as sub
Where sub.RowNum between @start and @start+@records
Это один из способов. Есть много других, если вы Google Paging SQL.
Гадкий, хакерский, но сработавший:
select top(M + N - 1) * from TableName
except
select top(N - 1) * from TableName