假设我有 2 个数据集:A 和 B,它们具有相同的列。我想获得“距离路径”——将数据集 A 更改为 B 所需的最少操作。
我可以假设,A 和 B 只包含一些差异,我正在寻找更好的东西,然后:
- 删除所有 A 的元素
- 将 B 的所有元素插入 A
这个怎么存档?
如果您知道如何使用 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;
如果您想了解如何将 A 转换为 B,您需要知道 A 和 B 之间的区别是什么。有一个非常简单的通用算法,尽管它可能会更复杂,具体取决于数据集中有多少字段以及其中有多少可以从 A 到 B 不同。但这是一般的想法:
less than
使用可以返回或equal
的比较来比较这两项greater than
。完成后,您将获得 A 和 B 之间差异的完整列表,这将使将 A 转换为 B 所需的步骤易于计算。