2009-06-25 3 views
0

Есть ли способ доступа MS для возврата набора данных между определенным индексом?MS Номер строки доступа, укажите индекс

Так позволяет сказать, что мой набор данных:

rank | first_name | age 
    1  Max  23 
    2  Bob  40 
    3  Sid  25 
    4  Billy  18 
    5  Sally  19 

Но я только хочу, чтобы вернуть эти записи между «ранга» 2 и 4, так что установить мои результаты Боб, Сид и Билли? Однако Rank не является частью таблицы, и это должно быть сгенерировано при запуске запроса. Почему бы мне не использовать автогенерированный номер, потому что если запись удалена, это будет непоследовательно, и что, если бы я хотел, чтобы результаты были обратными!

Это, очевидно, очень просто, и причина, по которой я спрашиваю, заключается в том, что я работаю над каталогом продуктов, и я ищу более эффективный способ подкачки через возвращаемый набор данных, поэтому, если я верну только данные на одну страницу с база данных, очевидно, будет быстрее, а затем вернет полный набор из 3000 записей, а затем придется отбирать из этого набора!

Благодаря Р.

+0

«Это, очевидно, очень просто» - свободная подсказка: в любое время, когда я слышу, что кто-то говорит об этом, я знаю, что проблема не проста, а только потому, что они хотят, чтобы это было просто. –

+0

Я думаю, что слово «индекс» в заголовке вводит в заблуждение. Рассмотрите изменение, например. «подкачки» или «ранжирование». – onedaywhen

+0

@ Дэвид У. Фентон: Я воспринял эту фразу, чтобы сказать: «Я не могу поверить, что я - Одинокий Рейнджер на этом, потому что пейджинг через результирующий набор SQL должен быть достаточно распространенным сценарием в реальном мире». ... в этом случае, я думаю, они верны. – onedaywhen

ответ

1

Оригинальное предложение:

SELECT * from table where rank BETWEEN 2 and 4; 

Модифицированный после комментария, что ранг не существует в структуре:

Select top 100 * from table; 

И если вы хотите, чтобы выбрать последующие результаты, вам может выбрать идентификатор последней записи из первого запроса, например, это идентификатор 101, и использовать предложение WHERE для получения следующих 100;

Select top 100 * from table where ID > 100; 

Но это не даст вам то, что вы ищите, держу пари.

+0

Нет, вы неправильно поняли мой вопрос, ранг не входит в набор данных. – flavour404

0

Если вы правильно поняли, в таблице есть ионы first_name и age. Если это так, то нет способа вернуть Боба, Сида и Билли с помощью одного запроса. Если вы ничего не делаете

SELECT * FROM Table 
WHERE FirstName = 'Bob' 
OR FirstName = 'Sid' 
OR FirstName = 'Billy' 

Но я думаю, что это не то, что вы ищете.

Это связано с тем, что базы данных SQL не гарантируют, что данные будут поступать из базы данных, если вы не укажете предложение ORDER BY. Обычно он появляется в том же порядке, в котором он был добавлен, но нет никаких гарантий, и как только вы получите много строк в своей таблице, существует достаточно высокая вероятность того, что они не выйдут в том порядке, в котором вы их помещаете .

В качестве примечания стороны, вероятно, вы должны добавить столбец «rank» (этот столбец обычно называется id) в вашу таблицу и сделать его автоматически увеличивающимся целым числом (см. Документацию Access), чтобы вы могли сделать запрос, упомянутый Сев. Также важно иметь первичный ключ, чтобы вы могли убедиться, какие строки обновляются при запуске запроса обновления или какие строки удаляются при запуске запроса на удаление. Например, если у вас было 2 человека по имени Макс, и им было 23, как вы удаляете 1 строку, не удаляя другую. Если у вас есть еще один автоматический приращение уникального столбца, вы можете указать уникальный идентификатор в своем запросе, чтобы удалить только один.

[ДОБАВЛЕНИЕ]

Прочитав ваш комментарий, если вы добавляете поле автоинкрементного, и хотите, чтобы прочитать 3 строки, и вы знаете, идентификатор первой строки вы хотите прочитать, то вы можете использовать «TOP «читать 3 строки.

Если предположить, что данные выглядит следующим образом

ID | first_name | age 
    1  Max  23 
    2  Bob  40 
    6  Sid  25 
    8  Billy  18 
    15  Sally  19 

Вы можете wuery Боб, Сид и Билли со следующим запросом.

SELECT TOP 3 FirstName, Age 
From Table 
WHERE ID >= 2 
ORDER BY ID 
+0

Привет, спасибо. Я obvioulsy плохо объяснил проблему. Я не могу использовать функцию автоматического номера, потому что, если строка удалена, пробел будет оставлен. Допустим, что я запрашиваю мою базу данных, и я получаю обратно набор данных, содержащий 40 строк, поэтому ранг будет пронумерован от 1 до 40, но из этого мне нужны только результаты 10 - 15.Подумайте об этом таким образом, когда вы возвращаете результаты на веб-сайт, на котором есть функция подкачки, скажем, у вас есть только 10 результатов, отображаемых на этой странице, поэтому мне не нужен весь набор данных, а вместо этого подмножество из 10 записей, с которыми для заполнения моей страницы. – flavour404

+0

См. Мое дополнение, чтобы узнать, как это можно сделать, когда у вас есть столбец идентификатора. – Kibbee

1

Как вы оцениваете ранг? Я предполагаю, что вы основываете его на некоторых данных в другом наборе данных где-то. Если это так, создайте функцию, соедините таблицу или сделайте то, что может вычислять ранг на основе значений в других таблицах, тогда вы можете делать запросы на основе функции rank().

Например:

select * 
from table 
where rank() between 2 and 4 

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

0

К сожалению, ключевое слово LIMIT недоступно в MS Access - это то, что используется в MySQL для многостраничной презентации. Если вы можете написать ключ заказа в таблицу результатов, то вы можете использовать это что-то вроде этого:

ВЫБРАТЬ TOP 25 MyOrder, и т.д. из Table1 WHERE MyOrder в (SELECT TOP 55 MyOrder FROM Table1 ORDER BY MyOrder DESC) ЗАКАЗАТЬ MyOrder ASCENDING

+0

В течение 24 часов после публикации кажется, что это две проблемы: создание «среднего» фрагмента набора записей, который может быть разрешен с вложением и использованием ключевого слова TOP; и создание серии «на лету», что кажется невозможным. И есть тайна того, что означает «ранг». – Smandoli

1

Я думаю, вам нужно использовать коррелированный подзапрос для вычисления ранга на лету, например Я предполагаю, что ранг основан на имя:

SELECT T1.first_name, T1.age, 
     (
     SELECT COUNT(*) + 1 
      FROM MyTable AS T2 
     WHERE T1.first_name > T2.first_name 
     ) AS rank 
FROM MyTable AS T1; 

Плохая новость двигатель данных Access плохо оптимизированы для такого рода запросов; по моему опыту, performace начнет заметно ухудшаться за несколько сотен рядов.

Если вы не можете сохранить ранг на стороне db дома (например, с высокой степенью вставки), подумайте о том, чтобы выполнить пейджинг на стороне клиента. Например, объект ADO classic recordset имеет свойства для поддержки поискового вызова (PageCount, PageSize, AbsolutePage и т. Д.), То, для чего у DAO-наборов записей (старые старомодные) нет поддержки.

Как всегда, вам придется выполнять свои собственные тайминги, но я подозреваю, что, когда есть, скажем, 10K строк, вы быстрее найдете накладные расходы, чтобы собрать все строки в набор записей ADO, а затем найти (тогда, возможно, скомпилируйте меньший набор записей ADO, состоящий только из строк этой строки), чем для выполнения коррелированного подзапроса, чтобы получить только количество строк для страницы.

Смежные вопросы