![]() |
|
![]() ![]() ![]() |
|
padWAN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 26.12.2006 Репутация: нет Всего: нет |
Есть 2 таблицы, имеющие одинаковый формат.
Таблица 1 называется OLD.DBF и имеет поля: code1 (тип numeric, длина 10), name1 (тип char, длина 50). Таблица 2 называется NEW.DBF и имеет поля: code2 (тип numeric, длина 10), name2 (тип char, длина 50). Задача: обновить и дополнить таблицу 1 записями из таблицы 2, т.е. если таблицы 1 и 2 содержат записи с одинаковыми значениями полей code1 и code2, то в результирующей таблице остаётся запись из таблицы 2; если в таблице 1 нет кода, который есть в таблице 2, то результирующая таблица должна содержать эту запись из таблицы 2. Эти 2 таблицы имеют порядка 60 тысяч записей, кроме того ещё кучу полей. Размер каждой из них порядка 60 мегабайт. Я решил, что надо разбить эту задачу. Шаг1. Сначала выделил из поля code2 2й таблицы те коды, которые есть в 1й таблице: SELECT new.code2 FROM new, old ; INTO DBF ToDelete NOCONSOLE NOWAIT ; WHERE old.code1=new.code2 Шаг2. Далее запускаю процедуру, которая должна отметить мне записи, подлежащие удалению: SELECT ToDelete GO TOP FOR h=1 TO RECCOUNT() SCATTER MEMVAR DELETE FROM old WHERE old.code1=M.code2 SELECT ToDelete SKIP ENDFOR Процедура выполняется ну ОЧЕНЬ ДОЛГО!(15 минут) И даже результат верный! Если бы программой пользовался только я, то можно жить, но... заказчику ТАКОЕ не понесёшь! Порекомендуйте, пожалуйста, как поступить. Как ускорить это действо? Необходимо учитывать, что у заказчика комп довольно тормознутый(Windows 98 SE) и места на жёстком диске не более 1 Гигабайта... Планируемый 3й шаг. SELECT old PACK APPEND FROM new |
|||
|
||||
Artiom |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1031 Регистрация: 11.3.2003 Где: Минск\Баку Репутация: 3 Всего: 17 |
попробуй построить индекс по полю code1
-------------------- Если тебя жизнь трахает, значит, ты ещё живой |
|||
|
||||
LNS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 26.12.2006 Репутация: нет Всего: нет |
Попробуй следующее.
Но работать будет только в том случае, если поля в обеих таблицах называются одинаково, так что если есть возможность, переименуй. Одинаковые имена нужны для APPEND. (Кстати, а как в твоем коде работал APPEND, если поля с разными именами??) 1. Построй индекс по code1 в обеих таблицах 2. Код FoxPro: SELECT 0 USE new ORDER code1 SELECT 0 USE old ORDER code1 SET RELATION TO code1 INTO new DELETE ALL FOR FOUND("new") PACK APPEND FROM new |
|||
|
||||
Cashey |
|
||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 13 Всего: 60 |
во первых не FOR, а SCAN. А во-вторых нафига здесь SCATTER MEMVAR???
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Foxpro/Clipper/Dbase" | |
|
Запрещается! 1. Публиковать ссылки для чисто рекламных целей. 2. Оффтопить, флеймить, говорить не культурно. Пожалуйста, адекватно задавайте свой вопрос. Тема должна создаваться с названием характеризующем Вашу проблему. Задавайте вопросы правильно - как спросите, так вам и ответят. Разрешено! Давать ссылки на статьи, обзоры, если это не нарушает первый пункт правил. Задавая вопрос, давайте нужную информацию касающуюся Вашей проблемы. Этим вы ускорите полезные ответы. P.S. Размещение рекламы будет строго наказываться! Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MoLeX |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Foxpro/Clipper/Dbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |