sql >> Base de Datos >  >> RDS >> Oracle

La forma más rápida de hacer comparaciones de campo en la misma tabla con grandes cantidades de datos en Oracle

En primer lugar, creo que su tarea se puede implementar (y debería serlo) con SQL directo. Sin cursores sofisticados, sin bucles, solo selecciona, inserta y actualiza. Comenzaría con la rotación de sus datos de origen (no está claro si tiene una clave principal para unir dos conjuntos, supongo que sí):

Col0_PK    Col1    Col2    Col3    Col4
----------------------------------------
Row1_val   A       B       C       D
Row2_val   E       F       G       H

Arriba están sus datos de origen. Usando UNPIVOT cláusula lo convertimos a:

Col0_PK     Col_Name    Col_Value
------------------------------
Row1_val    Col1        A
Row1_val    Col2        B
Row1_val    Col3        C
Row1_val    Col4        D
Row2_val    Col1        E
Row2_val    Col2        F
Row2_val    Col3        G
Row2_val    Col4        H

Creo que entiendes la idea. Digamos que tenemos table1 con un conjunto de datos y la misma table2 estructurada con el segundo conjunto de datos. Es una buena idea utilizar tablas organizadas por índices.

El siguiente paso es comparar las filas entre sí y almacenar los detalles de las diferencias. Algo como:

insert into diff_details(some_service_info_columns_here)
 select some_service_info_columns_here_along_with_data_difference
  from table1 t1 inner join table2 t2
     on t1.Col0_PK = t2.Col0_PK
    and t1.Col_name = t2.Col_name
    and nvl(t1.Col_value, 'Dummy1') <> nvl(t2.Col_value, 'Dummy2');

Y en el último paso actualizamos la tabla de resumen de diferencias:

insert into diff_summary(summary_columns_here)
 select diff_row_id, count(*) as diff_count
  from diff_details
 group by diff_row_id;

Es solo un borrador para mostrar mi enfoque, estoy seguro de que hay muchos más detalles que deben tenerse en cuenta. Para resumir sugiero dos cosas:

  1. UNPIVOT datos
  2. Usar SQL declaraciones en lugar de cursores