Я пытаюсь сделать что-то вроде:
SELECT * FROM table LIMIT 10,20
или
SELECT * FROM table LIMIT 10 OFFSET 10
но с использованием SQL Server
Единственное решение, которое я нашел, выглядит излишним:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
Я также нашел :
SELECT TOP 10 * FROM stuff;
... но это не то, что я хочу сделать, так как я не могу указать начальный лимит.
Есть ли другой способ для меня сделать это?
Кроме того, просто любопытно, есть ли причина, почему SQL Server не поддерживает LIMIT
функцию или что-то подобное? Я не хочу быть злым, но это действительно похоже на то, что нужно СУБД. Я работаю с MySQL и SQL + в течение последних 5 лет, так что ...
sql
sql-server
pagination
limit
marcgg
источник
источник
ROW_NUMBER()
и ограничениеTOP
ширины диапазона иWHERE
условия для границы диапазона - лучшее, чего я смог достичь. Я также заметил гораздо лучшую производительность, если вTOP
предложении вместо литерала используется литералОтветы:
Предложение
LIMIT
не является частью стандартного SQL. Он поддерживается как расширение вендора для SQL MySQL, PostgreSQL и SQLite.База данных других марок может иметь аналогичные функции (например,
TOP
в Microsoft SQL Server), но они не всегда работают одинаково.Трудно использовать
TOP
в Microsoft SQL Server, чтобы имитироватьLIMIT
предложение. Есть случаи, когда это просто не работает.Используемое вами решение
ROW_NUMBER()
доступно в Microsoft SQL Server 2005 и более поздних версиях. На данный момент это лучшее решение, которое работает исключительно как часть запроса.Другое решение состоит в том, чтобы использовать
TOP
выборку первых строк count + offset , а затем использовать API для поиска за первыми строками смещения .Смотрите также:
источник
Для SQL Server 2012 + вы можете использовать .
источник
offset
или можете оставить эту строку вне (при условии, что вы не хотите смещение)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
как вы обнаружили, это предпочтительный метод сервера sql:
источник
a
после внутреннего выбора? Я предполагаю, что вы даете внутреннему псевдониму выбора, но тогда вы, кажется, никогда не используете его ... Должны ли вы тогда делатьa.row
вместо простоrow
?( )
производной таблицы, но он отпустит его, если вы потом забудете использовать его для ссылки на столбцы. Я все исправил ...Если вы используете SQL Server 2012+ голоса для ответа Мартина Смита и использовать
OFFSET
иFETCH NEXT
расширенияORDER BY
,Если вам не повезло застрять в более ранней версии, вы можете сделать что-то вроде этого,
Я считаю, что функционально эквивалентно
и самый эффективный способ, который я знаю, делать это в TSQL до MS SQL 2012.
Если строк очень много, вы можете получить лучшую производительность, используя временную таблицу вместо CTE.
источник
К сожалению,
ROW_NUMBER()
это лучшее, что вы можете сделать. Это на самом деле более правильно, потому что результаты предложенияlimit
илиtop
не имеют смысла без учета определенного порядка. Но это все еще боль, чтобы сделать.Обновление: Sql Server 2012 добавляет
limit
похожую функцию через ключевые слова OFFSET и FETCH . Это анси-стандартный подход, аLIMIT
не нестандартное расширение MySql.источник
Как насчет этого?
Это дает вам последние 10 строк из первых 20 строк. Один недостаток в том, что порядок обратный, но, по крайней мере, его легко запомнить.
источник
Должны дать записи 11-20. Вероятно, не слишком эффективен при увеличении, чтобы получить дополнительные страницы, и не уверен, как это может повлиять на порядок. Возможно, придется указать это в обоих утверждениях WHERE.
источник
Хороший способ - создать процедуру:
просто как предел 0,2 /////////////// выполнить нумерацию страниц 0,4
источник
Только для рекордного решения, которое работает на большинстве систем баз данных, хотя, возможно, не является самым эффективным:
Заметьте: последняя страница будет по-прежнему содержать строки ReturnCount, независимо от того, что такое SkipCount. Но это может быть хорошо во многих случаях.
источник
Эквивалентом LIMIT является SET ROWCOUNT, но если вам нужна общая нумерация страниц, лучше написать запрос, подобный следующему:
источник
Будут печатать строки с 10 до 15.
источник
Пока этот формат работает для меня (но не самая лучшая производительность):
Обратите внимание, что разбивка динамических данных на страницы может привести к странным / неожиданным результатам.
источник
Из онлайновой документации по MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ) приведен пример, который я протестировал и работает для получения определенного набора строк. ROW_NUMBER требует OVER, но вы можете сделать заказ по своему усмотрению:
источник
Использовать весь SQL-сервер:; при tbl как (SELECT ROW_NUMBER () over (упорядочить по (выберите 1)) как RowIndex, * из таблицы) выбрать топ 10 * из tbl, где RowIndex> = 10
источник
он будет печатать от 15 до 25 как предел в MYSQl
источник