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

Hurtigste måde at lave feltsammenligninger i samme tabel med store mængder data i oracle

Først og fremmest tror jeg, at din opgave kan implementeres (og faktisk burde være det) med staight SQL. Ingen smarte markører, ingen loops, bare markeringer, indsættelser og opdateringer. Jeg ville starte med at fjerne pivotering af dine kildedata (det er ikke klart, om du har primærnøgle til at forbinde to sæt, det tror jeg du gør):

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

Ovenfor er dine kildedata. Brug af UNPIVOT klausul vi konverterer det til:

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

Jeg tror, ​​du forstår ideen. Lad os sige, at vi har tabel1 med et sæt data og den samme strukturerede tabel2 med det andet sæt data. Det er en god idé at bruge indeksorganiserede tabeller.

Næste trin er at sammenligne rækker med hinanden og gemme forskelsdetaljer. Noget som:

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

Og på det sidste trin opdaterer vi forskelsoversigtstabel:

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

Det er bare et groft udkast til at vise min tilgang, jeg er sikker på, at der er mange flere detaljer, der skal tages i betragtning. For at opsummere foreslår jeg to ting:

  1. UNPIVOT data
  2. Brug SQL udsagn i stedet for markører


  1. pip-installation MySQL-python fejler på ubuntu 14.04, fejl:kommando 'x86_64-linux-gnu-gcc' mislykkedes med afslutningsstatus 1

  2. Sådan tømmes alle rækker fra alle tabeller i mysql (i sql)

  3. hvordan man nulstiller Identity-kolonnen i Oracle

  4. FEJL 2002 (HY000):Kan ikke oprette forbindelse til lokal MySQL-server via socket '/tmp/mysql.sock'