質問

同じ列を持っている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

今テーブル 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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top