2011-06-10 92 views
0

可以說我有2個數據集:A和B,它們具有相同的列。我想獲得'距離路徑' - 需要完成的最小操作,將數據集A更改爲B.更新數據集

我可以假設,A和B只包含少數差異,我正在尋找更好的東西,然後:

  • 刪除所有A的元素
  • 插入所有B的元素融入到一個

這又如何存檔?

回答

2

如果您想了解如何將A轉換爲B,您需要知道A和B之間的區別是什麼。有應該是一個非常簡單的通用算法,儘管它可能取決於有多少場都在你的數據集,其中有多少可以從A到B是不同的更復雜,但這裏的總體思路:

  • 排序兩個數據集。確保按照完全相同的標準進行分類。 (在這一點上,如果它們都包含相同的一組數據元素,那麼它們的內容的兩個列表如果並排查看將是相同的。)
  • 以 數據集的第一項開始。將這兩個項目進行比較,可以返回less than,equalgreater than
    • 如果A < B,注意區別,並移動到A.
    • 如果A> B的下一行,注意區別,並移動到B.
    • 的下一行
    • 如果A = B,則將兩個數據集都推進到下一行。
  • 重複比較和前進步驟,直到您在兩個數據集上都達到EOF。

一旦你完成了,你將有一個完整的A和B之間的差異列表,這將使A到B轉換簡單計算所需的步驟。

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 

會給你一個不在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; 
+0

SQL解決方案是恕我直言,速度更快,因爲它將運行在服務器上,所以對於大量數據將更快。但恕我直言,你沒有回答以下兩點:「刪除所有A的元素+將所有B的元素插入A」。 A仍然在那裏。請在你的答案中添加一個'DELETE * FROM B'語句。 ;) – 2011-06-11 08:39:09