質問
同じ列を持っている2つのデータセットの2つのデータセットがあるとしましょう。 「距離パス」を取得したい - データセットAをBに変更するには、最小限の操作を行う必要があります。
私は、AとBには少数の違いのみが含まれていると仮定することができます、そして、私はより良いものを探しています。
- すべてのAの要素を削除します
- すべてのbの要素をaに挿入します
これをどのようにアーカイブできますか?
解決
AをBに変換する方法を見つけたい場合は、AとBの違いを知る必要があります。そのためには非常に単純な一般的なアルゴリズムがありますが、データセットに含まれるフィールドの数とAからBとは異なるフィールドの数によっては、より複雑になる可能性がありますが、一般的なアイデアは次のとおりです。
- 両方のデータセットを並べ替えます。まったく同じ基準で並べ替えてください。 (この時点で、どちらも同じデータ要素のセットを含んでいた場合、その内容の2つのリストは並んで表示される場合、同一です。)
- 両方のデータセットの最初のアイテムから始めます。 2つのアイテムを返すことができる比較と比較してください
less than
,equal
またgreater than
. - a <bの場合、違いに注意して、Aの次の行に移動します
- a> bの場合、違いに注意して、Bの次の行に移動します
- a = bの場合、両方のデータセットを次の行まで進めます。
- 両方のデータセットでEOFに到達するまで、比較とアドバンスのステップを繰り返します。
完了したら、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にないAのすべてのフィールドを提供します
今やる
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;
所属していません StackOverflow