G
Guest
Есть 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
Таблица 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