Question

Disons que j'ai 2 jeux de données: A et B, qui ont les mêmes colonnes. Je veux obtenir le « chemin de distance » -. Opérations minimales nécessaires à faire pour changer les jeux de données A à B

Je peux supposer que A et B ne contiennent que dans quelques différences et je cherche quelque chose de mieux, alors:

  • supprimer tous les éléments de A
  • insérer les éléments de tous les B en A

Comment cela peut-il être archivé

Était-ce utile?

La solution

Si vous voulez savoir comment transformer A en B, vous devez savoir ce que la différence entre A et B est. Il y a un algorithme général très simple pour cela, mais il pourrait être plus compliqué en fonction du nombre de champs dans votre ensemble de données et combien d'entre eux peuvent être différents de A à B. Mais voici l'idée générale:

  • Trier les deux ensembles de données. Assurez-vous de tri sur les mêmes critères précis. (À ce stade, si elles contenaient tous deux le même ensemble d'éléments de données, les deux listes de leur contenu seraient identiques si côté vu par côté.)
  • Commencez par le premier élément à la fois ensembles de données. Comparez les deux points avec une comparaison qui peut retourner less than, equal ou greater than.
    • Si A
    • Si A> B, notez la différence et passer à la ligne suivante de B.
    • Si A = B, avancent les deux ensembles de données à la ligne suivante.
  • Répétez l'étape et l'avance comparer jusqu'à ce que vous avez atteint EOF sur les deux ensembles de données.

Une fois que vous avez terminé, vous aurez une liste complète des différences entre A et B, qui fera les étapes nécessaires pour transformer A à B simple à calculer.

Autres conseils

Si vous savez comment utiliser SQL:

SELECT a.* FROM a 
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL

vous donnera tous les champs A qui ne sont pas en B.

Maintenant, faites

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

Et puis faire (ou ne le font pas en fonction de vos besoins).

DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL

tableau a et b sera le même.

le code Delphi comme celui-ci devrait faire l'affaire, mais le code exact dépend de votre base de données et les composants de requête utilisés.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top