Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le moyen le plus rapide de faire des comparaisons de champs dans la même table avec de grandes quantités de données dans Oracle

Tout d'abord, je crois que votre tâche peut être implémentée (et devrait l'être en fait) avec SQL direct. Pas de curseurs sophistiqués, pas de boucles, juste des sélections, des insertions et des mises à jour. Je commencerais par annuler le pivotement de vos données source (il n'est pas clair si vous avez une clé primaire pour joindre deux ensembles, je suppose que vous en avez) :

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

Ci-dessus se trouvent vos données source. Utilisation de UNPIVOT clause nous le convertissons en :

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

Je pense que vous avez compris l'idée. Supposons que nous ayons table1 avec un ensemble de données et la même table2 structurée avec le deuxième ensemble de données. C'est une bonne idée d'utiliser des tableaux organisés en index.

L'étape suivante consiste à comparer les lignes les unes aux autres et à stocker les détails des différences. Quelque chose comme :

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

Et à la dernière étape, nous mettons à jour le tableau récapitulatif des différences :

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

C'est juste un brouillon pour montrer ma démarche, je suis sûr qu'il y a beaucoup plus de détails à prendre en compte. Pour résumer, je suggère deux choses :

  1. UNPIVOT données
  2. Utiliser SQL instructions au lieu de curseurs