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

Łączenie 2 if block i tworzenie pojedynczego zapytania

(UWAGA:ten kod nie został przetestowany i mogę być poza przecinkiem tutaj lub nawiasem tam...)

Wydaje się, że te dwa bloki różnią się tylko kolumną działania i złączeniem, więc możesz wyeliminować 2 odnogi IF i przenieść sprawdzanie p_update_mode do instrukcji CASE w następujący sposób:

CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
                                                  p_update_mode VARCHAR2) IS
BEGIN
  INSERT INTO dynamicentitygtt
    (entity_type, entity_id, entity_code, synonyms, action)
    WITH data_view AS
     ( -- ITEM table
      SELECT 'ITEM' entity_type, -- This separates inserted values
              item_id data_id,
              item_name data_name,
              item_desc data_desc,
              creation_date
        FROM itemde
      UNION ALL
      -- ORG table
      SELECT 'ORG' entity_type, -- This separates inserted values
              org_id,
              org_name,
              org_desc,
              creation_date
        FROM orgde
      -- NEXT entity table
      )
    SELECT upper(t.entity_type),
           t.data_id,
           t.data_name,
           t.data_desc,
           CASE lower(p_update_mode)
             WHEN 'incremental' THEN
               CASE
                 WHEN t.creation_date > b.max_last_update_date THEN
                   'update'
                 WHEN t.creation_date < b.max_last_update_date THEN
                   'add'
               END
             WHEN 'full' THEN
              'add' 
           END action
      FROM data_view t
           LEFT JOIN batch_run_details b
                  ON b.entity_type = t.entity_type
                 AND lower(p_update_mode )='incremental'
     WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
       AND (lower(p_update_mode) = 'full'
            OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
           );
        
END update_dynamic_entity;

Zapytanie w twoim FULL bloku mówi, że nie powinniśmy dołączać do B w tym trybie. Tak więc klauzula LEFT JOIN zwraca wiersze tylko w trybie INCREMENTAL, ale nie powinna generować żadnych wierszy w trybie FULL.

To musi być sprzężenie LEWE, w przeciwnym razie możemy nie otrzymać żadnych wierszy z Twojego data_view, które nie odpowiadają encji w trybie B dla trybu FULL. Innymi słowy, jeśli pozostanie to zwykłym JOIN, twoje ogólne zapytanie otrzyma zero wierszy w trybie FULL z powodu klauzuli AND w łączeniu.

Wreszcie filtr AND w klauzuli WHERE na dole staje się konieczny teraz, gdy istnieje LEFT JOIN. Bez tego, gdy działasz w trybie INCREMENTAL, otrzymasz KAŻDY wiersz w swoim data_view NIEZALEŻNIE od tego, czy istnieje odpowiedni wiersz encji w B, czy nie. Nawet jeśli dołączasz na entity_id, lewe sprzężenie przywróci wiersz dla każdego wiersza w T, nawet bez pasującego wiersza w B, ponieważ właśnie do tego zaprojektowano LEFT JOIN.

Wszystko to powiedziawszy, będziesz musiał zdecydować, czy warto łączyć te dwa bloki. Tylko dlatego, że MOŻESZ, nie oznacza, że ​​POWINNO. Twoja wydajność może być lepsza, pozostawiając ją taką, jaką masz – przeprowadź kilka testów. Tylko Ty znasz ilość danych i częstotliwość przetwarzania. Musisz również rozważyć utrzymanie swojego kodu, ponieważ następny facet/galeria będzie musiał dowiedzieć się, co się tutaj dzieje.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak zamienić akcentowaną literę w kolumnie varchar2 w oracle

  2. Przypisanie kursora funkcji

  3. Potrzebujesz pomocy, aby przenieść wartość kolumny 8k z R do kolumny CLOB (Oracle)

  4. Wykorzystanie kolumny typu BLOB w Oracle APEX

  5. Pobierz wartość z FieldA, wyślij do funkcji db, zwróć wartość do FieldB