Domanda

Diciamo che ho 2 set di dati: A e B, che hanno le stesse colonne. Voglio ottenere il 'percorso a distanza' -. Operazioni minime necessarie per essere fatto, cambiare set di dati da A a B

I può assumere, che A e B contengono solo in poche differenze e sto cercando qualcosa di meglio, allora:

  • rimuovere tutti gli elementi di A
  • Inserisci tutti gli elementi di B in A

Come può essere archiviata?

È stato utile?

Soluzione

Se si vuole trovare il modo di trasformare A in B, è necessario sapere quale sia la differenza tra A e B è. C'è un semplice algoritmo generale per questo, anche se potrebbe essere più complicato a seconda di quanti campi sono nel vostro set di dati e quanti di loro possono essere diverso da A a B. Ma qui è l'idea generale:

  • Ordina entrambi i set di dati. Assicurati di sorta sugli stessi criteri esatti. (A questo punto, se entrambi contenevano lo stesso insieme di elementi di dati, le due liste dei loro contenuti sarebbero identici se visti affiancati.)
  • Inizia con il primo elemento di entrambi set di dati. Confrontare le due voci con un confronto che può restituire less than, equal o greater than.
    • Se A
    • Se A> B, notare la differenza e passare alla successiva riga di B.
    • Se A = B, avanzano due serie di dati alla riga successiva.
  • ripetere il passaggio compare-and-anticipo fino a quando hai raggiunto EOF su entrambi i set di dati.

Una volta fatto, si avrà un elenco completo delle differenze tra A e B, che renderà i passi necessari per trasformare A a B semplice da calcolare.

Altri suggerimenti

Se si sa come utilizzare SQL:

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

vi darà tutti i campi di A che non sono in B.

Ora fare

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

E poi fare (o non fare a seconda delle esigenze).

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

Ora a tavolo e b sarà lo stesso.

codice Delphi come questo dovrebbe fare il trucco, ma il codice esatto dipende dalla vostra base di dati ed i componenti di query utilizzate.

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top