В PostgreSQL есть Limit
и Offset
ключевые слова , которые позволят очень легко пагинации результирующих множеств.
Каков эквивалентный синтаксис для SQL Server?
sql
sql-server
pagination
limit
offset
Earlz
источник
источник
Ответы:
Эквивалент
LIMIT
естьSET ROWCOUNT
, но если вам нужна общая нумерация страниц, лучше написать такой запрос:Преимущество здесь заключается в параметризации смещения и предела в случае, если вы решите изменить параметры подкачки (или позволить пользователю сделать это).
Примечание:
@Offset
параметр следует использовать одну индексирование для этого , а не нормальной индексации с нуля.источник
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
, MSSQL2008 R2.Table
есть 200 тыс. Записей, сначала он получит все, а затем установит лимит? Этот запрос эффективен?Эта функция теперь упрощена в SQL Server 2012. Она работает с SQL Server 2012 и выше.
Предел со смещением для выбора от 11 до 20 строк в SQL Server:
OFFSET
: количество пропущенных строкNEXT
: необходимое количество следующих строкСсылка: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
источник
SQL_CALC_FOUND_ROWS
при использовании этого?Примечание. Это решение будет работать только в SQL Server 2005 или более поздней версии, поскольку это было тогда, когда оно
ROW_NUMBER()
было реализовано.источник
AS xx
Вы можете использовать ROW_NUMBER в выражении Common Table для достижения этой цели.
источник
Для меня использование OFFSET и FETCH вместе было медленным, поэтому я использовал комбинацию TOP и OFFSET, как это (что было быстрее):
Примечание. Если вы используете TOP и OFFSET вместе в одном запросе, например:
Затем вы получите сообщение об ошибке, поэтому для совместного использования TOP и OFFSET вам необходимо разделить его подзапросом.
И если вам нужно использовать SELECT DISTINCT, запрос выглядит так:
Примечание: использование SELECT ROW_NUMBER с DISTINCT для меня не сработало.
источник
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, вы должны преобразовать его какSELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. Я отредактирую свой ответ. Спасибо и извините за мой английский.Другой образец:
источник
Существует здесь кто - то говорил об этой функции в SQL 2011, его печально они выбирают немного другое ключевое слово «OFFSET / FETCH» , но его не стандарт , то нормально.
источник
Добавляя небольшую вариацию решения Аарона, я обычно параметризую номер страницы (@PageNum) и размер страницы (@PageSize). Таким образом, каждое событие нажатия страницы просто отправляет запрошенный номер страницы вместе с настраиваемым размером страницы:
источник
Самое близкое, что я мог сделать, это
Который, я думаю, похож на
select * from [db].[dbo].[table] LIMIT 0, 10
источник
источник
источник
источник
Поскольку никто еще не предоставил этот код:
Важные моменты:
@limit
может быть заменен количеством результатов для извлечения,@offset
количество пропущенных результатовwhere
иorder by
содержит предложения и будет давать неверные результаты, если они не синхронизированыorder by
есть ли явно, если это то, что нужноисточник
Специально для SQL-SERVER вы можете достичь этого разными способами. Для данного реального примера мы взяли таблицу Customer здесь.
Пример 1: с помощью «SET ROWCOUNT»
Чтобы вернуть все строки, установите ROWCOUNT в 0
Пример 2: с "ROW_NUMBER and OVER"
Пример 3: с "OFFSET and FETCH", но с этим "ORDER BY" является обязательным
Надеюсь, это поможет вам.
источник
В SQL-сервере вы должны использовать TOP вместе с ROW_NUMBER ()
источник
С тех пор, как я тестирую больше раз, этот скрипт более полезен на 1 миллион записей на каждой странице. 100 записей с разбивкой на страницы работают быстрее, мой компьютер выполняет этот скрипт за 0 секунд, в то время как сравнение с mysql имеет собственный предел и смещение около 4.5 секунд, чтобы получить результат.
Кто-то может не заметить, что Row_Number () всегда сортируется по определенному полю. В случае, если нам нужно определить только строку в последовательности, следует использовать:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
Объясните:
источник