Существует метод к подкачке страниц с помощью ANSI SQL только?

9
задан shA.t 14 May 2015 в 11:30
поделиться

7 ответов

Посмотрите Предел — с разделом смещения на этой странице: http://troels.arvin.dk/db/rdbms/

BTW, Firebird также поддерживает пункт СТРОК начиная с версии 2.0

6
ответ дан 4 December 2019 в 20:25
поделиться

Никакой официальный путь, нет.*

Обычно Вы будете хотеть иметь абстрактную функцию в своем слое доступа к базе данных, который справится с нею для Вас; дайте ему подсказку, что Вы находитесь на 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, Вы не можете указать стартовую точку, таким образом, все еще необходимо выбрать и выбросить некоторые строки.

2
ответ дан 4 December 2019 в 20:25
поделиться

Я проверил бы ответы на этот вопрос - вероятно, для запущения Вас.

1
ответ дан 4 December 2019 в 20:25
поделиться

Вставьте свои результаты в стол с возможностью хранения, заказанный, как требуется отобразить их, но с новым столбцом IDENTITY.

Теперь ВЫБЕРИТЕ из той таблицы просто диапазон идентификаторов, которыми Вы интересуетесь.

(Обязательно вычистите таблицу, когда Вы будете сделаны),


Или сделайте это на клиенте, поскольку что-либо, чтобы сделать с презентацией не должно обычно делаться на SQL Server (по-моему),

0
ответ дан 4 December 2019 в 20:25
поделиться

Я знаю, что я очень, очень поздно к этому вопросу, но это - все еще один из главных результатов для этой проблемы.

Однако один ответ, отсутствующий для этого вопроса, состоит в том, что я верит "корректному" методу ANSI SQL для подкачки страниц, по крайней мере, если Вы хотите максимальную мобильность, не использовать LIMIT / OFFSET / FIRST и т.д. вообще, но вместо этого сделать что-то как:

SELECT *
FROM MyTable
WHERE ColumnA > ?
ORDER BY ColumnA ASC

, Где ? параметр, пользующийся библиотекой, которая поддерживает их (такой как PDO в PHP).

идея здесь проста при выборке первой страницы, мы передаем параметр, который будет соответствовать каждой возможной строке, например, - если ColumnA будет текст, мы передали бы пустую строку (''). Мы затем читаем в стольких результатах, сколько мы хотим и затем выпускаем остальных. Это может означать, что некоторые дополнительные строки выбираются негласно, но наш приоритет здесь является совместимостью.

для выборки следующей страницы, мы принимаем значение ColumnA от последней строки в наших результатах и передаем ее в как параметр, этот способ, которым мы только выберем значения, которые появляются после нее. Для выполнения того же запроса в другом направлении просто подкачайте > для [1 110] и ASC для [1 112].

существуют некоторые важные протесты этого подхода:

  1. , Так как мы используем условие, Ваш DBMS свободен использовать индекс для оптимизации запроса, который может на самом деле быть быстрее, чем некоторые "надлежащие" методы разбиения на страницы, поскольку Вы устраняете строки вместо того, чтобы совершенствоваться мимо них.
  2. Эта форма подкачки страниц более плотно привязывается, чем основанные на номере строки методы. При использовании смещений номера строки, если Вы смещаете в таблицу, но новые строки добавляются, что вид ранее, чем текущая страница, затем она заставит результаты быть смещенными в более поздние страницы. Например, если последняя строка Вашей текущей страницы mango, но начиная с выборки его располагает в ряд, добавляются для [1 114] и carrot, затем mango может теперь появиться на следующей странице также, когда она была смещена в порядке сортировки. При помощи условия [1 117] этого не может произойти. Это может быть очень полезно в случаях, где Вы сортируете по DATETIME с частым появлением обновлений.
  3. Этот прием может быть сделан работать в обоих направлениях путем инвертирования порядка сортировки, как упомянуто при движении назад (зеркальное отражение > к [1 120] и ASC к [1 122]) и передаче в значении [1 123] от первой строки каждой страницы результатов, а не последнем. Обратите внимание, что, если значения были добавлены к Вашей таблице, это может означать, что Ваша первая страница может быть короче, но это - довольно незначительная проблема.
  4. , Чтобы быть уверенными Вы идете последнее (или сначала) страница, необходимо выбрать N + 1 строки, где N количество строк, Вы хотите на страницу, этот способ, которым можно обнаружить, существует ли больше строк для выборки.
  5. Этот метод работает лучше всего, если у Вас есть отдельный столбец только с уникальными значениями, но все еще возможно использовать в более сложных случаях, пока можно развернуть Ваш ORDER BY пункт (и WHERE условие) для включения достаточного количества столбцов, что каждая строка уникальна.

, Таким образом, это не без нескольких выгод, но это - безусловно самый совместимый метод, поскольку каждая база данных SQL будет поддерживать его.

0
ответ дан 4 December 2019 в 20:25
поделиться

Кстати, Troels, PostgreSQL поддерживает ограничение / смещение

0
ответ дан 4 December 2019 в 20:25
поделиться
ANSI Sql example:
offset=41, fetchsize=10

SELECT TOP(10) *
FROM table1
WHERE table1.ID NOT IN (SELECT TOP(40) table1.ID FROM table1)
0
ответ дан 4 December 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: