Frage

Nehmen wir an, ich habe 2 Datensätze: A und B, die die gleichen Spalten haben. Ich möchte den 'Distanzpfad' - minimale Vorgänge benötigen, um die Datensätze A auf B. zu ändern

Ich kann annehmen, dass A und B nur in wenigen Unterschieden enthalten und ich suche etwas Besseres, dann:

  • Entfernen Sie alle Elemente von A
  • Fügen Sie alle Elemente von B in a ein

Wie kann das archiviert werden?

War es hilfreich?

Lösung

Wenn Sie herausfinden möchten, wie Sie A in B verwandeln können, müssen Sie wissen, was der Unterschied zwischen A und B ist. Dafür gibt es einen sehr einfachen allgemeinen Algorithmus, obwohl es möglicherweise komplizierter ist, je nachdem, wie viele Felder in Ihrem Datensatz enthalten sind und wie viele von ihnen sich von A bis B. unterscheiden können, aber hier ist die allgemeine Idee:

  • Sortieren Sie beide Datensätze. Stellen Sie sicher, dass Sie genau die gleichen Kriterien sortieren. (An diesem Punkt wären beide die gleichen Datenelemente, die zwei Listen ihres Inhalts identisch wären, wenn sie nebeneinander betrachtet werden.)
  • Beginnen Sie mit dem ersten Element beider Datensätze. Vergleichen Sie die beiden Elemente mit einem Vergleich, der zurückkehren kann less than, equal oder greater than.
    • Wenn a <b, beachten Sie den Unterschied und bewegen Sie sich in die nächste Reihe von A.
    • Wenn a> b, beachten Sie den Unterschied und bewegen Sie sich in die nächste Reihe von B.
    • Wenn a = b, fördern Sie beide Datensätze in die nächste Zeile.
  • Wiederholen Sie den Vergleichs- und Advance-Schritt, bis Sie EOF in beiden Datensätzen erreicht haben.

Sobald Sie fertig sind, haben Sie eine vollständige Liste der Unterschiede zwischen A und B, wodurch die für die Umwandlung von a zu berechnenden Schritten erforderlich sind.

Andere Tipps

Wenn Sie wissen, wie man SQL verwendet:

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

Ich werde Ihnen alle Felder in a geben, die nicht in B. sind

Mach jetzt

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

Und dann tun (oder tun Sie nicht je nach Ihren Bedürfnissen).

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

Jetzt Tabelle a und b wird dasselbe sein.

Der Delphi -Code wie diesen sollte den Trick ausführen, aber der genaue Code hängt von Ihrer Datenbank und den verwendeten Abfragebonden ab.

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top