sql >> Databáze >  >> RDS >> Oracle

Kombinace 2 bloků if a vytvoření jediného dotazu

(POZNÁMKA:tento kód není testován a může být mimo čárku nebo závorku tam...)

Zdá se, že tyto dva bloky se liší pouze ve sloupci akce a spojení, takže byste mohli odstranit 2 větve IF a přesunout kontrolu p_update_mode do příkazu CASE, jako je tento:

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;

Dotaz ve vašem FULL bloku říká, že bychom se v tomto režimu neměli připojit k B. Klauzule LEFT JOIN tedy vrací řádky zpět pouze v režimu INCREMENTAL, ale neměla by vytvářet žádné řádky pro režim FULL.

Toto musí být LEVÉ spojení, jinak nemusíme z vašeho data_view získat žádné řádky, které neodpovídají entitám v B pro režim FULL. Jinými slovy, pokud by to zůstalo jako normální JOIN, váš celkový dotaz by v režimu FULL získal nula řádků kvůli klauzuli AND ve spojení.

A konečně, filtr AND v klauzuli WHERE ve spodní části je nyní nezbytný, když existuje LEFT JOIN. Bez toho byste při spuštění v INCREMENTAL režimu dostali KAŽDÝ řádek ve vašem data_view BEZ OHLEDU na to, zda je v B odpovídající řádek entity nebo ne. I když se připojujete na entity_id, levé spojení vrátí řádek zpět pro každý řádek v T i bez shodného řádku v B, protože k tomu byly navrženy LEFT JOINy.

Vše, co bylo řečeno, budete se muset rozhodnout, zda stojí za to smíchat tyto dva bloky. To, že MŮŽETE, neznamená, že MUSÍTE. Váš výkon může být lepší ponechat to tak, jak to máte – proveďte nějaké testy. Pouze vy znáte objem dat a frekvenci zpracování. Musíte také zvážit údržbu svého kódu, protože další chlap/holka bude muset zjistit, co se tady děje.




  1. Zlepšení výkonu ORDER BY na křížovém spojení jsonb s vnitřním spojením skupiny by

  2. Oracle text escapující se složenými závorkami a zástupnými znaky

  3. Odstranit databázové poštovní zprávy z databáze msdb v SQL Server (T-SQL)

  4. jak zkontrolovat jedinečnost (neduplikaci) příspěvku v rss feedu