sql >> Databasteknik >  >> RDS >> Oracle

Snabbaste sättet att göra fältjämförelser i samma tabell med stora mängder data i Oracle

Först och främst tror jag att din uppgift kan implementeras (och borde faktiskt göras) med enkel SQL. Inga snygga markörer, inga loopar, bara markeringar, infogar och uppdateringar. Jag skulle börja med att avpivotera dina källdata (det är inte klart om du har primärnyckeln för att sammanfoga två uppsättningar, jag antar att du gör det):

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

Ovan är din källdata. Använder UNPIVOT klausul vi konverterar det till:

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

Jag tror att du förstår idén. Säg att vi har tabell1 med en uppsättning data och samma strukturerade tabell2 med den andra uppsättningen data. Det är bra att använda indexorganiserade tabeller.

Nästa steg är att jämföra rader med varandra och lagra skillnadsdetaljer. Något i stil med:

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

Och i det sista steget uppdaterar vi skillnadsöversiktstabellen:

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

Det är bara ett grovt utkast för att visa mitt tillvägagångssätt, jag är säker på att det finns mycket mer detaljer som bör beaktas. För att sammanfatta föreslår jag två saker:

  1. UNPIVOT data
  2. Använd SQL uttalanden istället för markörer


  1. Informationssystem, data och information

  2. Använda mysql_real_escape_string med PDO (ingen anslutning till localhost-server)

  3. Konvertera datumformat i PHP

  4. Hur man lägger till rankningspositioner för rader i SQL med RANK()