Oracle
 sql >> Database >  >> RDS >> Oracle

Il modo più veloce per eseguire confronti sui campi nella stessa tabella con grandi quantità di dati in Oracle

Prima di tutto credo che il tuo compito possa essere implementato (e dovrebbe essere effettivamente) con SQL costante. Nessun cursore di fantasia, nessun loop, solo selezioni, inserimenti e aggiornamenti. Inizierei con l'annullamento del pivot dei dati di origine (non è chiaro se hai la chiave primaria per unire due set, immagino che tu lo faccia):

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

Sopra sono i tuoi dati di origine. Utilizzo di UNPIVOT clausola lo convertiamo in:

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

Penso che tu abbia l'idea. Supponiamo di avere table1 con un set di dati e la stessa table2 strutturata con il secondo set di dati. È una buona idea utilizzare tabelle organizzate per indici.

Il passaggio successivo consiste nel confrontare le righe tra loro e memorizzare i dettagli della differenza. Qualcosa come:

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');

E nell'ultimo passaggio aggiorniamo la tabella di riepilogo delle differenze:

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

È solo una bozza per mostrare il mio approccio, sono sicuro che dovrebbero essere presi in considerazione molti più dettagli. Per riassumere ti suggerisco due cose:

  1. UNPIVOT dati
  2. Usa SQL istruzioni al posto dei cursori