Посмотрите Предел — с разделом смещения на этой странице: http://troels.arvin.dk/db/rdbms/
BTW, Firebird также поддерживает пункт СТРОК начиная с версии 2.0
Никакой официальный путь, нет.*
Обычно Вы будете хотеть иметь абстрактную функцию в своем слое доступа к базе данных, который справится с нею для Вас; дайте ему подсказку, что Вы находитесь на MySQL или PostgreSQL, и это может добавить 'ПРЕДЕЛЬНЫЙ' пункт к Вашему запросу или rownum по подзапросу для Oracle и так далее. Если это не знает, что может сделать любого из тех, отступить к выборке партии и возврату только части полного списка.
*: ЭТА: существует теперь, в ANSI SQL:2003. Но это глобально не поддерживается, это часто работает плохо, и это - что-то вроде боли, потому что необходимо перемещаться/копировать ПОРЯДОК в новое место в операторе, который мешает переноситься автоматически:
SELECT * FROM (
SELECT thiscol, thatcol, ROW_NUMBER() OVER (ORDER BY mtime DESC, id) AS rownumber
)
WHERE rownumber BETWEEN 10 AND 20 -- care, 1-based index
ORDER BY rownumber;
Существует также "ВЫБОРКА ПЕРВЫЕ n СТРОКИ ТОЛЬКО" суффикс в SQL:2008 (и DB2, где это произошло). Но как префикс TOP в SQL Server и подобный синтаксис в Informix, Вы не можете указать стартовую точку, таким образом, все еще необходимо выбрать и выбросить некоторые строки.
Я проверил бы ответы на этот вопрос - вероятно, для запущения Вас.
Вставьте свои результаты в стол с возможностью хранения, заказанный, как требуется отобразить их, но с новым столбцом IDENTITY.
Теперь ВЫБЕРИТЕ из той таблицы просто диапазон идентификаторов, которыми Вы интересуетесь.
(Обязательно вычистите таблицу, когда Вы будете сделаны),
Или сделайте это на клиенте, поскольку что-либо, чтобы сделать с презентацией не должно обычно делаться на SQL Server (по-моему),
Я знаю, что я очень, очень поздно к этому вопросу, но это - все еще один из главных результатов для этой проблемы.
Однако один ответ, отсутствующий для этого вопроса, состоит в том, что я верит "корректному" методу ANSI SQL для подкачки страниц, по крайней мере, если Вы хотите максимальную мобильность, не использовать LIMIT
/ OFFSET
/ FIRST
и т.д. вообще, но вместо этого сделать что-то как:
SELECT *
FROM MyTable
WHERE ColumnA > ?
ORDER BY ColumnA ASC
, Где ?
параметр, пользующийся библиотекой, которая поддерживает их (такой как PDO
в PHP).
идея здесь проста при выборке первой страницы, мы передаем параметр, который будет соответствовать каждой возможной строке, например, - если ColumnA
будет текст, мы передали бы пустую строку (''
). Мы затем читаем в стольких результатах, сколько мы хотим и затем выпускаем остальных. Это может означать, что некоторые дополнительные строки выбираются негласно, но наш приоритет здесь является совместимостью.
для выборки следующей страницы, мы принимаем значение ColumnA
от последней строки в наших результатах и передаем ее в как параметр, этот способ, которым мы только выберем значения, которые появляются после нее. Для выполнения того же запроса в другом направлении просто подкачайте >
для [1 110] и ASC
для [1 112].
существуют некоторые важные протесты этого подхода:
mango
, но начиная с выборки его располагает в ряд, добавляются для [1 114] и carrot
, затем mango
может теперь появиться на следующей странице также, когда она была смещена в порядке сортировки. При помощи условия [1 117] этого не может произойти. Это может быть очень полезно в случаях, где Вы сортируете по DATETIME
с частым появлением обновлений. >
к [1 120] и ASC
к [1 122]) и передаче в значении [1 123] от первой строки каждой страницы результатов, а не последнем. Обратите внимание, что, если значения были добавлены к Вашей таблице, это может означать, что Ваша первая страница может быть короче, но это - довольно незначительная проблема. N + 1
строки, где N
количество строк, Вы хотите на страницу, этот способ, которым можно обнаружить, существует ли больше строк для выборки. ORDER BY
пункт (и WHERE
условие) для включения достаточного количества столбцов, что каждая строка уникальна. , Таким образом, это не без нескольких выгод, но это - безусловно самый совместимый метод, поскольку каждая база данных SQL будет поддерживать его.
Кстати, Troels, PostgreSQL поддерживает ограничение / смещение
ANSI Sql example:
offset=41, fetchsize=10
SELECT TOP(10) *
FROM table1
WHERE table1.ID NOT IN (SELECT TOP(40) table1.ID FROM table1)