LIMIT в FoxPro - PullRequest
       35

LIMIT в FoxPro

5 голосов
/ 23 марта 2009

Я пытаюсь получить МНОГО данных из базы данных Fox Pro, работать с ней и вставить ее в базу данных mysql. Это слишком много, чтобы сделать все сразу, поэтому вы хотите сделать это партиями, скажем, 10 000 записей. Что эквивалентно LIMIT 5, 10 в Fox Pro SQL, хотел бы оператор выбора как

выберите имя, адрес из списка людей 5, 10;

т.е. вернуть только 10 результатов, начиная с 5-го. Посмотрели в Интернете, и они упоминают только топ, который явно не очень полезен.

Ответы [ 8 ]

4 голосов
/ 23 марта 2009

Посмотрите на функцию RecNo () .

2 голосов
/ 07 апреля 2009

FoxPro не имеет прямой поддержки предложения LIMIT. У него действительно «TOP nn», но он предоставляет только «самые верхние записи» в пределах заданного процента, и даже он имеет ограничение в 32 тыс. Возвращаемых записей (максимум).

Возможно, вам лучше сбросить данные как CSV или, если это непрактично (из-за проблем с размером), написать небольшой скрипт FoxPro, который автоматически генерирует серию операторов BEGIN-INSERT (x10000) -COMMIT этот дамп в ряд текстовых файлов. Конечно, для этого вам потребуется среда разработки FoxPro, так что это может не относиться к вашей ситуации ...

1 голос
/ 10 февраля 2016

Очень легко обойти предложение LIMIT с помощью предложения TOP; если вы хотите извлечь из записи _start запись _finish из файла с именем _test, вы можете сделать:

[VFP]

** при условии _start <= _finish, если нет, вы получите ошибку верхнего предложения </p>

*

_finish = MIN (RECCOUNT ('_ test'), _ finish)

*

ВЫБРАТЬ * ОТ (ВЫБРАТЬ ТОП (_finish - _start + 1) * ОТ (ВЫБРАТЬ ТОП _finish *, RECNO () КАК _tempo ОТ _test ЗАКАЗАТЬ _tempo) xx ЗАКАЗАТЬ _tempo DESC) yy ЗАКАЗАТЬ _tempo

**

[/ VFP]

1 голос
/ 21 июля 2015

Visual FoxPro не поддерживает LIMIT напрямую. Я использовал следующий запрос, чтобы преодолеть ограничение: SELECT TOP 100 * from PEOPLE WHERE RECNO() > 1000 ORDER BY ID; где 100 - это предел, а 1000 - это смещение.

0 голосов
/ 05 апреля 2016

В зависимости от количества возвращаемых строк и от того, что вы используете .NET Framework, вы можете сместить / ограничить полученный DataTable следующим образом:

dataTable = dataTable.AsEnumerable().Skip(offset).Take(limit).CopyToDataTable();

Не забудьте добавить сборку System.Data.DataSetExtensions.

0 голосов
/ 04 июля 2013

Здесь, адаптируйте это к вашим таблицам. Это заняло у меня 2 минуты, я делаю это слишком часто.

N1 - группируйте по какому-либо значению, и убедитесь, что у вас есть максимум (id), вы можете использовать recno (), чтобы сделать его, отсортированный правильно

N2 - Объединяет N1, где ID = Макс. Id N1, отображает поле, которое вы хотите от N2

Затем, если вы хотите присоединиться к другим таблицам, поместите все это в квадратные скобки, укажите псевдоним и включите его в объединение.

Select N1.reference, N1.OrderNoteCount, N2.notes_desc LastNote
FROM
(select reference, count(reference) OrderNoteCount, Max(notes_key) MaxNoteId
from custnote 
where  reference != '' 
Group by reference
) N1
JOIN 
(
select reference, count(reference) OrderNoteCount, notes_key, notes_desc
from custnote 
where  reference != '' 
Group by reference, notes_key, notes_desc
) N2 ON N1.MaxNoteId = N2.notes_key
0 голосов
/ 15 апреля 2009

Чтобы расширить ответ Эйвинда, я бы создал программу, использующую функцию RecNo () для извлечения записей в заданном диапазоне, скажем, 10000 записей.

Затем вы могли бы программно циклически проходить по большой таблице в кусках по 10 000 записей за раз и предварительно загружать данные в базу данных MySQL.

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

0 голосов
/ 23 марта 2009

Несколько лет назад мне пришлось конвертировать базу данных Foxpro в Mysql. Чтобы решить эту проблему, я добавил в таблицу Foxpro столбец идентификатора с автоинкрементом и использовал его в качестве ссылки на строку.

Так что тогда вы могли бы сделать что-то вроде.

select name, address from people where id >= 5 and id <= 10;

Документация Foxpro sql не показывает ничего похожего на ограничение.

...