Есть ли способ в SQL Server получить результаты, начиная с заданного смещения? Например, в базе данных SQL другого типа можно:
SELECT * FROM MyTable OFFSET 50 LIMIT 25
для получения результатов 51-75. Эта конструкция не существует в SQL Server.
Как я могу сделать это, не загружая все строки, которые мне не нужны? Спасибо!
sql
sql-server
Alex
источник
источник
Ответы:
Я бы не стал использовать
SELECT *
. Укажите столбцы, которые вам действительно нужны, даже если это могут быть все столбцы.SQL Server 2005+
SQL Server 2000
Эффективное разбиение на страницы больших наборов результатов в SQL Server 2000
Более эффективный метод разбиения на страницы больших наборов результатов
источник
SELECT *
означает, что если структура таблицы изменится, ваш запрос все равно будет выполняться, но дает другие результаты. Если столбец добавлен, это может быть полезно (хотя вам все равно нужно где-то использовать его по имени); если столбец удален или переименован, лучше, чтобы ваш SQL сломался заметно, чем код в дальнейшем ведет себя странно из-за неинициализации переменной.Если вы будете обрабатывать все страницы по порядку, то простое запоминание последнего значения ключа, показанного на предыдущей странице, и использование
TOP (25) ... WHERE Key > @last_key ORDER BY Key
может быть наиболее эффективным методом, если существуют подходящие индексы, позволяющие эффективно искать это, - или курсор API, если они этого не делают. ,Для выбора произвольной страницы лучшим решением для SQL Server 2005 - 2008 R2, вероятно, является
ROW_NUMBER
иBETWEEN
Для SQL Server 2012+ вы можете использовать расширенное предложение ORDER BY для этой необходимости.
Хотя еще неизвестно, насколько хорошо будет работать этот вариант .
источник
Это один из способов (SQL2000)
и это другой способ (SQL 2005)
источник
Вы можете использовать
ROW_NUMBER()
функцию, чтобы получить то, что хотите:источник
Есть
OFFSET .. FETCH
в SQL Server 2012, но вам нужно будет указатьORDER BY
столбец.Если у вас действительно нет явного столбца, который вы могли бы передать как
ORDER BY
столбец (как предлагали другие), вы можете использовать этот трюк:... или
Мы используем его в jOOQ, когда пользователи явно не указывают порядок. Это приведет к довольно случайному порядку без каких-либо дополнительных затрат.
источник
Для таблиц с большим количеством столбцов данных я предпочитаю:
-
Он имеет гораздо лучшую производительность для таблиц с большими данными, такими как BLOB, потому что функция ROW_NUMBER должна просматривать только один столбец, и только соответствующие строки возвращаются со всеми столбцами.
источник
Смотрите мой выбор для paginator
Это решает нумерацию страниц;)
источник
источник
В зависимости от вашей версии вы не можете сделать это напрямую, но вы можете сделать что-нибудь взломанное, например
где «поле» - это ключ.
источник
Ниже будут отображены 25 записей, за исключением первых 50 записей, работающих в SQL Server 2012.
вы можете заменить идентификатор по своему усмотрению
источник
Вы должны быть осторожны при использовании
ROW_NUMBER() OVER (ORDER BY)
оператора, поскольку производительность довольно низкая. То же самое касается использования общих табличных выраженийROW_NUMBER()
, но это еще хуже. Я использую следующий фрагмент, который оказался немного быстрее, чем использование табличной переменной с идентификатором для предоставления номера страницы.источник
Я использую эту технику для нумерации страниц. Я беру не все строки. Например, если на моей странице должны отображаться 100 верхних строк, я беру только 100 с предложением where. Выходные данные SQL должны иметь уникальный ключ.
В таблице есть следующее:
Один и тот же ранг будет присвоен более чем одному ключевому идентификатору.
SQL это
select top 2 * from Table1 where Rank >= @Rank and ID > @Id
Впервые я выставил 0 для обоих. Во второй раз проходят 1 и 14. В третий раз проходят 2 и 6 ....
Значение десятой записи Rank & Id передается следующему
Это будет наименьшей нагрузкой на систему.
источник
В SqlServer2005 вы можете сделать следующее:
источник
@Offset + @Limit - 1
? Если @Limit равен 10, это вернет 11 строк.Лучший способ сделать это, не тратя время на заказ записей:
это занимает меньше секунды!
лучшее решение для больших столов.
источник
Я уже некоторое время искал этот ответ (для общих запросов) и нашел другой способ сделать это на SQL Server 2000+, используя ROWCOUNT и курсоры, без TOP или какой-либо временной таблицы.
Используя
SET ROWCOUNT [OFFSET+LIMIT]
вы можете ограничить результаты, а с помощью курсоров перейти непосредственно к нужной строке, а затем выполнить цикл до конца.Итак, ваш запрос будет таким:
источник
В SQL Server 2012 (11.x) и более поздних версиях и в базе данных SQL Azure у вас также может быть "fetch_row_count_expression", вы также можете иметь предложение ORDER BY вместе с этим.
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Примечание. СМЕЩЕНИЕ. Указывает количество строк, которые нужно пропустить, прежде чем он начнет возвращать строки из выражения запроса. Это НЕ номер начального ряда. Итак, чтобы включить первую запись, должно быть 0.
источник