Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Najszybszy sposób na porównania pól w tej samej tabeli z dużą ilością danych w Oracle

Przede wszystkim wierzę, że Twoje zadanie może zostać zrealizowane (i powinno być) za pomocą prostego SQL. Bez wymyślnych kursorów, bez pętli, po prostu zaznacza, wstawia i aktualizuje. Zacząłbym od unpivotingu twoich danych źródłowych (nie jest jasne, czy masz klucz podstawowy do połączenia dwóch zestawów, myślę, że tak):

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

Powyżej znajdują się Twoje dane źródłowe. Korzystanie z UNPIVOT klauzula konwertujemy to na:

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

Myślę, że masz pomysł. Załóżmy, że mamy table1 z jednym zestawem danych i taką samą ustrukturyzowaną tabelę2 z drugim zestawem danych. Dobrym pomysłem jest użycie tabel zorganizowanych według indeksu.

Następnym krokiem jest porównanie wierszy ze sobą i przechowywanie szczegółów różnic. Coś takiego:

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

W ostatnim kroku aktualizujemy tabelę podsumowującą różnice:

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

To tylko wstępny szkic, aby pokazać moje podejście, jestem pewien, że należy wziąć pod uwagę znacznie więcej szczegółów. Podsumowując, proponuję dwie rzeczy:

  1. UNPIVOT dane
  2. Użyj SQL oświadczenia zamiast kursorów


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd Oracle PLS-00323:podprogram lub kursor jest zadeklarowany w specyfikacji pakietu i musi być zdefiniowany w treści pakietu

  2. Oracle REGEXP_REPLACE ciąg zastępujący wielkie litery

  3. Konwertowanie dużego obiektu CLOB na ciąg .NET w celu umieszczenia w komórce DataGridView

  4. Zapytanie SQL do rozwiązania przechodnich zależności w bazie danych

  5. Oracle Insert przez Select z wielu tabel, w których jedna tabela może nie mieć wiersza