0

假设我有 2 个数据集:A 和 B,它们具有相同的列。我想获得“距离路径”——将数据集 A 更改为 B 所需的最少操作。

我可以假设,A 和 B 只包含一些差异,我正在寻找更好的东西,然后:

  • 删除所有 A 的元素
  • 将 B 的所有元素插入 A

这个怎么存档?

4

2 回答 2

3

如果您知道如何使用 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

现在表ab将是相同的。

像这样的 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;
于 2011-06-10T21:46:33.447 回答
2

如果您想了解如何将 A 转换为 B,您需要知道 A 和 B 之间的区别是什么。有一个非常简单的通用算法,尽管它可能会更复杂,具体取决于数据集中有多少字段以及其中有多少可以从 A 到 B 不同。但这是一般的想法:

  • 对两个数据集进行排序。确保按照完全相同的标准进行排序。(此时,如果它们都包含相同的数据元素集,如果并排查看,它们的两个内容列表将是相同的。)
  • 从两个数据集的第一项开始。less than使用可以返回或equal的比较来比较这两项greater than
    • 如果 A < B,请注意差异并移动到 A 的下一行。
    • 如果 A > B,请注意差异并移至 B 的下一行。
    • 如果 A = B,将两个数据集推进到下一行。
  • 重复比较和推进步骤,直到在两个数据集上都达到 EOF。

完成后,您将获得 A 和 B 之间差异的完整列表,这将使将 A 转换为 B 所需的步骤易于计算。

于 2011-06-10T23:58:09.583 回答