sql >> Database >  >> RDS >> Oracle

Snelste manier om veldvergelijkingen uit te voeren in dezelfde tabel met grote hoeveelheden gegevens in Oracle

Allereerst geloof ik dat je taak kan worden geïmplementeerd (en eigenlijk zou moeten zijn) met vaste SQL. Geen fancy cursors, geen loops, gewoon selecteren, invoegen en bijwerken. Ik zou beginnen met het ongedaan maken van de draaiing van je brongegevens (het is niet duidelijk of je een primaire sleutel hebt om twee sets samen te voegen, ik denk dat je dat wel doet):

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

Hierboven staan ​​uw brongegevens. UNPIVOT gebruiken clausule we zetten het om naar:

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

Ik denk dat je het idee snapt. Stel dat we tabel1 hebben met één set gegevens en dezelfde gestructureerde tabel2 met de tweede set gegevens. Het is een goed idee om index-georganiseerde tabellen te gebruiken.

De volgende stap is het vergelijken van rijen met elkaar en het opslaan van verschildetails. Iets als:

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

En bij de laatste stap werken we de samenvattende tabel met verschillen bij:

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

Het is slechts een ruwe schets om mijn aanpak te laten zien, ik weet zeker dat er met veel meer details rekening moet worden gehouden. Om samen te vatten stel ik twee dingen voor:

  1. UNPIVOT gegevens
  2. Gebruik SQL uitspraken in plaats van cursors


  1. Voer tekst en speciale tekens in en MySQL

  2. Stel invoerwaarde in bij geselecteerde optie in php

  3. Uitzondering afhandelen en resultaat van functie retourneren

  4. Verwijder dubbele rijen in MySQL