可以說我有2個數據集:A和B,它們具有相同的列。我想獲得'距離路徑' - 需要完成的最小操作,將數據集A更改爲B.更新數據集
我可以假設,A和B只包含少數差異,我正在尋找更好的東西,然後:
- 刪除所有A的元素
- 插入所有B的元素融入到一個
這又如何存檔?
可以說我有2個數據集:A和B,它們具有相同的列。我想獲得'距離路徑' - 需要完成的最小操作,將數據集A更改爲B.更新數據集
我可以假設,A和B只包含少數差異,我正在尋找更好的東西,然後:
這又如何存檔?
如果您想了解如何將A轉換爲B,您需要知道A和B之間的區別是什麼。有應該是一個非常簡單的通用算法,儘管它可能取決於有多少場都在你的數據集,其中有多少可以從A到B是不同的更復雜,但這裏的總體思路:
less than
,equal
或greater than
。一旦你完成了,你將有一個完整的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
會給你一個不在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;
SQL解決方案是恕我直言,速度更快,因爲它將運行在服務器上,所以對於大量數據將更快。但恕我直言,你沒有回答以下兩點:「刪除所有A的元素+將所有B的元素插入A」。 A仍然在那裏。請在你的答案中添加一個'DELETE * FROM B'語句。 ;) – 2011-06-11 08:39:09