SQL MERGE příkaz – INSERT, UPDATE, DELETE jedním vrzem

Příkaz SQL MERGE je pokročilý způsob jak porovnat 2 tabulky (Source a Destination). Porovnáváme záznamy a na základě shody (nebo neshody) prováníme UPDATE, INSERT nebo DELETE podle toho, jak porovnání záznamů v tabulkách dopadne.

Využijeme zejména při synchronizaci dat mezi objekty/systémy nebo při ETL procesech v rámci datového skladu.

Syntaxe:

MERGE CilovaTabulka AS TARGET
USING ZdrojovaTabulka AS SOURCE
                  ON
WHEN MATCHED THEN
WHEN NOT MATCHED BY TARGET THEN
WHEN NOT MATCHED BY SOURCE THEN ;

Příklad SQL MERGE příkazu

Představme si 2 tabulky a dejme tomu, že je budeme mezi sebou synchronizovat:

  • dbo.PracovniPozice (DESTINATION) – Cílová tabulka, která se nachází v datovém skladu
  • dbo.PracovniPozice_ZdrojovySystem (SOURCE) –  Tabulka ve zdrojovém systému ze které budeme synchronizovat

Synchronizované pole bude pozice zamestnancu – „ZamestnanecPozice“. Syntaxe sql MERGE je velmi intuitivní a bude obsahovat 3 větve:

  • Pokud záznam existuje na zdroji i cilové destinaci, provádíme UPDATE (WHEN MATCHED)
  • Pokud záznam v cílové tabulce neexistuje, provádíme INSERT (NOT MATCHED)
  • Pokud záznam neexistuje ve zrojové tabulce a cílové ano, provádíme DELETE (NOT MATCHED BY SOURCE)
MERGE dbo.PracovniPozice AS TARGET
USING  dbo.PracovniPozice_ZdrojovySystem AS SOURCE
                  ON TARGET.ID_Pozice = SOURCE.ID_Pozice
WHEN MATCHED AND 1=1 THEN 
                  UPDATE SET TARGET.ZamestnanecPozice=SOURCE.ZamestnanecPozice
WHEN NOT MATCHED BY TARGET THEN
                  INSERT (ID_Pozice, ZamestnanecPozice)
                  VALUES (ID_Pozice, ZamestnanecPozice)
WHEN NOT MATCHED BY SOURCE THEN
                 DELETE;

Poznámka: Pokud nevíte k čemu jsem to sekce „WHEN MATCHED“ psal AND 1=1, tak jsem tím chtěl naznačit, že můžete v MATCHED částech definovat podmínky

Reagovat na příspěvek