• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Vfp 6. Выборка из 2х огромных таблиц. Удаление.

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
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
 
M

MadVBS

Мне кажется, что если необходимо в любом случае оставлять записи из таблицы 2, то почему бы не запустить SQL-запрос на удаление из таблицы 1 всех записей, имеющихся в таблице 2:
Шаг 1:
delete from Таблица1 where code1 in (select code2 as code1 from Таблица2)
pack

Шаг 2:
А затем вставить все имеющиеся строки из Таблицы 2 в Таблицу 1 следующим извращенным способом:
select code2 as code1, name2 as name1 into table tm1 from Таблица2
sele таблица1
append from tm1
use in tm1
delete file tm1.dbf

Во-первых не нужно обходить все строки циклом, это намного ускоряет работу.
А во-вторых, SQL-запросы всегда быстрее работают.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!