Обновление набора данных
Допустим, у меня есть 2 набора данных: A и B, которые имеют одинаковые столбцы. Я хочу получить "путь расстояния" - нужно было выполнить минимальные операции, чтобы изменить наборы данных A на B.
Я могу предположить, что A и B содержат только несколько различий, и я ищу что-то лучшее, тогда:
- удалить все элементы А
- вставить все элементы B в A
Как это можно заархивировать?
2 ответа
Если вы хотите узнать, как преобразовать A в B, вам нужно знать, в чем разница между A и B. Для этого есть очень простой общий алгоритм, хотя он может быть более сложным, в зависимости от того, сколько полей в вашем наборе данных и сколько из них может отличаться от A до B. Но вот общая идея:
- Сортировать оба набора данных. Обязательно сортируйте по точно таким же критериям. (На этом этапе, если бы они оба содержали один и тот же набор элементов данных, два списка их содержимого были бы идентичны, если смотреть рядом.)
- Начните с первого элемента обоих наборов данных. Сравните два элемента со сравнением, которое можно вернуть
less than
,equal
или жеgreater than
, - Если A
- Если A > B, обратите внимание на разницу и перейдите к следующему ряду B.
- Если A = B, переместите оба набора данных на следующую строку.
- Повторяйте шаг сравнения и продвижения, пока не достигнете EOF в обоих наборах данных.
Когда вы закончите, у вас будет полный список различий между A и B, что сделает шаги, необходимые для преобразования A в B, простыми для вычисления.
Если вы знаете, как использовать SQL:
SELECT a.* FROM a
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
Даст вам все поля в A, которых нет в B.
Сейчас делаю
INSERT INTO b
SELECT a.* FROM a
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
А потом делай (или не делай в зависимости от своих потребностей).
DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL
Сейчас стол a
а также b
будет таким же.
Подобный код Delphi должен помочь, но точный код зависит от вашей базы данных и используемых компонентов запросов.
procedure TForm1.equalize(A, B: TDataset);
var
tablenameA: string;
tablenameB: string;
MyQuery: TQuery;
begin
tablenameA:= IProviderSupport(A).PSGetTableName;
tablenameB:= IProviderSupport(B).PSGetTableName;
MyQuery:= TQuery.Create(self);
MyQuery.Database:= .....
MyQuery.SQL.Text:= ' INSERT INTO '+tablenameA+' .....
MyQuery.ExecSQL;
end;