Смещение строк в SQL Server - PullRequest
       94

Смещение строк в SQL Server

124 голосов
/ 09 октября 2008

Есть ли способ в SQL Server получить результаты, начиная с заданного смещения? Например, в другом типе базы данных SQL это можно сделать:

SELECT * FROM MyTable OFFSET 50 LIMIT 25

, чтобы получить результаты 51-75. Эта конструкция не существует в SQL Server.

Как я могу сделать это, не загружая все строки, которые меня не интересуют? Спасибо!

Ответы [ 16 ]

2 голосов
/ 09 октября 2008

В зависимости от вашей версии вы не можете сделать это напрямую, но вы можете сделать что-то хакерское, как

select top 25 *
from ( 
  select top 75 *
  from   table 
  order by field asc
) a 
order by field desc 

где 'поле' является ключом.

1 голос
/ 15 января 2017

Лучший способ сделать это, не тратя время на заказ записей, выглядит так:

select 0 as tmp,Column1 from Table1 Order by tmp OFFSET 5000000 ROWS FETCH NEXT 50 ROWS ONLY

это займет не более одной секунды!
лучшее решение для больших столов.

1 голос
/ 19 марта 2013

Я использую эту технику для нумерации страниц. Я не выбираю все строки. Например, если моя страница должна отображать первые 100 строк, я выбираю только 100 с предложением where. Выходные данные SQL должны иметь уникальный ключ.

Таблица имеет следующее:

ID, KeyId, Rank

Один и тот же ранг будет присвоен более чем одному ключевому идентификатору.

SQL равно select top 2 * from Table1 where Rank >= @Rank and ID > @Id

Впервые я передаю 0 для обоих. Второй проход 1 и 14. Третий проход 2 и 6 ....

Значение десятой записи Rank & Id передается следующему

11  21  1
14  22  1
7   11  1
6   19  2
12  31  2
13  18  2

Это будет иметь наименьшую нагрузку на систему

1 голос
/ 09 октября 2008

В SqlServer2005 вы можете делать следующее:

DECLARE @Limit INT
DECLARE @Offset INT
SET @Offset = 120000
SET @Limit = 10

SELECT 
    * 
FROM
(
   SELECT 
       row_number() 
   OVER 
      (ORDER BY column) AS rownum, column2, column3, .... columnX
   FROM   
     table
) AS A
WHERE 
 A.rownum BETWEEN (@Offset) AND (@Offset + @Limit-1) 
0 голосов
/ 28 января 2019

Самый простой способ будет

SELECT * FROM table ORDER BY OrderColumn ASC LIMIT 50,25;

Это работает в MySQL и (я думаю) в других базах данных SQL.

0 голосов
/ 13 апреля 2012

Я уже некоторое время искал этот ответ (для общих запросов) и нашел другой способ сделать это на SQL Server 2000+, используя ROWCOUNT и курсоры, без TOP или какой-либо временной таблицы.

Используя SET ROWCOUNT [OFFSET+LIMIT], вы можете ограничить результаты, а с помощью курсоров перейти непосредственно к нужной строке, затем зациклить 'до конца.

Таким образом, ваш запрос будет выглядеть так:

SET ROWCOUNT 75 -- (50 + 25)
DECLARE MyCursor SCROLL CURSOR FOR SELECT * FROM pessoas
OPEN MyCursor
FETCH ABSOLUTE 50 FROM MyCursor -- OFFSET
WHILE @@FETCH_STATUS = 0 BEGIN
    FETCH next FROM MyCursor
END
CLOSE MyCursor
DEALLOCATE MyCursor
SET ROWCOUNT 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...