Microsoft Access и подкачки больших наборов данных - PullRequest
2 голосов
/ 09 октября 2009

Есть ли простой способ листать большие наборы данных с помощью базы данных Access через прямой SQL? Допустим, мой запрос обычно возвращает 100 строк, но я хочу, чтобы запрос просматривал результаты так, чтобы он извлекал (скажем, только первые 10 строк). До тех пор, пока я не запрошу следующие 10 строк, он запросит строки 11-20.

Ответы [ 3 ]

2 голосов
/ 12 октября 2009

Механизм доступа к базе данных не очень хорошо справляется с этим: собственный синтаксис TOP N возвращает связи, и параметр N не может быть параметризован; оптимизатор не совсем хорошо обрабатывает эквивалентную конструкцию подзапроса :(

Но, честно говоря, это то, что SQL вообще не очень хорошо обрабатывает. Это один из немногих сценариев, где я бы рассматривал динамический SQL (дрожь). Но сначала я хотел бы рассмотреть возможность использования классического набора записей ADO, который имеет свойства AbsolutePage, PageCount и PageSize (чего, впрочем, нет в библиотеках DAO).


Вы также можете рассмотреть возможность использования малоизвестного синтаксиса LIMIT TO nn ROWS Access Database Engine. Из справки Access 2003 :

Возможно, вы захотите использовать ANSI-92 SQL для следующие причины ... ...

  • Использование предложения LIMIT TO nn ROWS для ограничения количества строк, возвращаемых запросом

Может пригодиться?

... мой язык прочно вошел в мою щеку :) Этот синтаксис не существует в Access Database Engine и никогда не существует. Вместо этого это еще один пример ужасающего состояния документации Access на стороне двигателя дома.

Подходит ли продукт по назначению, если в документации имеются большие дыры и контент не может быть доверенным? будьте бдительны.

2 голосов
/ 09 октября 2009

Если вы выполните запрос ранжирования, вы получите столбец, содержащий возрастающие числа в ваших выходных данных. Затем можно выполнить запрос к этому столбцу, используя предложение BETWEEN...AND для выполнения подкачки.

Так, например, если каждая из ваших страниц содержит 10 записей и вам нужна третья страница, вы должны сделать:

SELECT * FROM MyRankingQuery WHERE MyAscendingField BETWEEN 30 and 39

Как ранжировать записи в запросе
Поддержка Microsoft KB208946

1 голос
/ 09 октября 2009

Я не уверен, как рейтинг отвечает на ваш вопрос. Кроме того, у меня возникают проблемы с представлением, зачем вам это нужно - обычно это то, что вы делаете на веб-сайте, чтобы разбить данные, полученные на небольшие куски. Но база данных Jet / ACE не очень хороший кандидат для серверной части сайта, если только она не предназначена только для чтения.

Еще одно решение SQL будет использовать вложенный TOP N, но обычно для написания SQL требуется процедурный код «на лету».

У него также есть проблема со связями, в которой, если вы не включите уникальное поле в свой ORDER BY, вы можете получить 11 записей с ТОП-10, если две записи будут связаны со значениями в предложении ORDER BY. *

Я не предполагаю, что это лучшее решение, просто другое.

...