Pregunta

Digamos que tengo 2 conjuntos de datos: A y B, que tienen las mismas columnas. Quiero obtener la 'ruta de distancia': se deben realizar operaciones mínimas para cambiar los conjuntos de datos A a B.

Puedo suponer que A y B contienen solo en pocas diferencias y estoy buscando algo mejor, entonces:

  • Eliminar todos los elementos de A
  • inserte todos los elementos de B en un

¿Cómo se puede archivar esto?

¿Fue útil?

Solución

Si desea averiguar cómo transformar A en B, necesita saber cuál es la diferencia entre A y B. Hay un algoritmo general muy simple para eso, aunque podría ser más complicado dependiendo de cuántos campos hay en su conjunto de datos y cuántos de ellos pueden ser diferentes de A a B. Pero aquí está la idea general:

  • Ordena ambos conjuntos de datos. Asegúrese de ordenar exactamente los mismos criterios. (En este punto, si ambos contenían el mismo conjunto de elementos de datos, las dos listas de sus contenidos serían idénticas si se ve una al lado de la otra).
  • Comience con el primer elemento de ambos conjuntos de datos. Compare los dos elementos con una comparación que puede devolver less than, equal o greater than.
    • Si a <b, tenga en cuenta la diferencia y muévase a la siguiente fila de A.
    • Si A> B, tenga en cuenta la diferencia y muévase a la siguiente fila de B.
    • Si a = B, avance ambos conjuntos de datos a la siguiente fila.
  • Repita el paso de comparación y advance hasta que haya alcanzado EOF en ambos conjuntos de datos.

Una vez que haya terminado, tendrá una lista completa de diferencias entre A y B, lo que hará que los pasos necesarios para transformar A a B sean fáciles de calcular.

Otros consejos

Si sabe cómo usar SQL:

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

Te dará todos los campos en un que no están en B.

Ahora haz

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

Y luego hazlo (o no lo haga dependiendo de sus necesidades).

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

Ahora mesa a y b será lo mismo.

El código de Delphi como este debería hacer el truco, pero el código exacto depende de su base de datos y los componentes de consulta utilizados.

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top