Mise à jour ensemble de données
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é
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
ougreater 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;