Обновление набора данных - PullRequest
0 голосов
/ 11 июня 2011

Допустим, у меня есть 2 набора данных: A и B, которые имеют одинаковые столбцы.Я хочу получить «дистанционный путь» - необходимо выполнить минимальные операции, чтобы изменить наборы данных A на B.

Я могу предположить, что A и B содержат только несколько различий, и я ищу что-толучше, тогда:

  • удалить все элементы A
  • вставить все элементы B в A

Как это можно заархивировать?

Ответы [ 2 ]

3 голосов
/ 11 июня 2011

Если вы знаете, как использовать 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;
2 голосов
/ 11 июня 2011

Если вы хотите узнать, как преобразовать A в B, вам нужно знать, в чем разница между A и B.Для этого есть очень простой общий алгоритм, хотя он может быть более сложным, в зависимости от того, сколько полей в вашем наборе данных и сколько из них может отличаться от A до B. Но вот общая идея:

  • Сортировка обоих наборов данных.Обязательно сортируйте по точно таким же критериям.(На этом этапе, если они оба содержат один и тот же набор элементов данных, два списка их содержимого будут идентичны, если смотреть рядом.)
  • Начните с первого элемента обоих наборов данных.Сравните два элемента со сравнением, которое может вернуть less than, equal или greater than.
    • Если A
    • Если A> B, запишите разницу и перейдите к следующему ряду B.
    • Если A = B, переместите оба набора данных на следующую строку.
  • Повторяйте шаг сравнения и продвижения, пока не достигнете EOF в обоих наборах данных.

Как только вы закончите, у вас будет полный список различий между A и B, что сделает шаги, необходимые для преобразования A в B, простыми для вычисления.

...