Как получить N строк, начиная со строки M, из отсортированной таблицы в T-SQL - PullRequest
63 голосов
/ 17 апреля 2009

Существует простой способ получить верхние N строк из любой таблицы:

SELECT TOP 10 * FROM MyTable ORDER BY MyColumn

Есть ли эффективный способ запроса M строк, начиная со строки N

Например,

Id Value
1    a
2    b
3    c
4    d
5    e
6    f

И запрос как этот

SELECT [3,2] * FROM MyTable ORDER BY MyColumn /* hypothetical syntax */

запрашивает 2 строки, начиная с 3-й строки, т. Е. Возвращаются 3-я и 4-я строки.

Ответы [ 17 ]

1 голос
/ 13 мая 2015

Я прочитал все ответы здесь и, наконец, нашел простое в использовании решение. Проблемы с производительностью возникают из-за оператора BETWEEN, а не из генерации самих номеров строк. Поэтому я использовал алгоритм для динамического пейджинга, передавая номер страницы и количество записей.

Пропусками являются не начальная строка и количество строк, а "строки на страницу (500)" и "номер страницы (4)", которые будут строками 1501-2000. Эти значения можно заменить переменными хранимой процедуры вы не привязаны к использованию определенной суммы подкачки.

select * from (
    select
        (((ROW_NUMBER() OVER(ORDER BY MyField) - 1) / 500) + 1) AS PageNum
        , *
    from MyTable
) as PagedTable
where PageNum = 4;
1 голос
/ 01 мая 2013

И вот как вы можете достичь той же цели для таблиц без первичного ключа:

select * from
(
    select row_number() over(order by (select 0)) rowNum,*
    from your_table
) tmp
where tmp.rowNum between 20 and 30 -- any numbers you need
1 голос
/ 08 августа 2011

Следующий простой запрос выведет список из N строк из M + 1-й строки таблицы. Замените M и N вашими предпочтительными числами.

Select Top N B.PrimaryKeyColumn from 
    (SELECT 
        top M PrimaryKeyColumn
     FROM 
        MyTable
) A right outer join MyTable B 
on 
    A.PrimaryKeyColumn = B.PrimaryKeyColumn
where 
    A.PrimaryKeyColumn IS NULL

Пожалуйста, дайте мне знать, полезно ли это для вашей ситуации.

0 голосов
/ 17 апреля 2009

Найти идентификатор для строки 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)

0 голосов
/ 13 августа 2014
SELECT * FROM (
  SELECT
    Row_Number() Over (Order by (Select 1)) as RawKey,
    * 
  FROM [Alzh].[dbo].[DM_THD_TRANS_FY14]
) AS foo
WHERE RawKey between 17210400 and 17210500
0 голосов
/ 17 апреля 2009

Существует довольно простой метод для T-SQL, хотя я не уверен, эффективен ли он до prestanda, если пропускаете большое количество строк.

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);

Это имеет обратную сторону, что вы получаете все данные из хранилища данных.

0 голосов
/ 17 апреля 2009

Почему бы не сделать два запроса:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...