Sloučení dat na základě více tabulek

Dokončeno

V databázových operacích je někdy potřeba provést operaci SLOUČENÍ SQL. Tato možnost DML umožňuje synchronizovat dvě tabulky vložením, aktualizací nebo odstraněním řádků v jedné tabulce na základě rozdílů nalezených v druhé tabulce. Upravená tabulka se označuje jako cílová tabulka. Tabulka, která slouží k určení řádků, které se mají změnit, se nazývají zdrojové tabulky.

FUNKCE MERGE upraví data na základě jedné nebo více podmínek:

  • Pokud zdrojová data mají v cílové tabulce odpovídající řádek, může aktualizovat data v cílové tabulce.
  • Pokud zdrojová data nemají v cíli žádnou shodu, může vložit data do cílové tabulky.
  • Pokud cílová data nemají ve zdroji žádnou shodu, může cílová data odstranit.

Obecná syntaxe příkazu MERGE je znázorněna níže. Porovnáváme cíl a zdroj v zadaném sloupci a pokud existuje shoda mezi cílem a zdrojem, určíme akci, která se má provést v cílové tabulce. Pokud není shoda, určíme akci. Akce může být operace INSERT, UPDATE nebo DELETE. Tento kód označuje, že se provede aktualizace, když existuje shoda mezi zdrojem a cílem. Funkce INSERT se provádí, když zdroj obsahuje data bez odpovídajících dat v cíli. Nakonec se provede odstranění v případě, že v cíli jsou data bez shody ve zdroji. Existuje mnoho dalších možných forem příkazu MERGE.

MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN 
   UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
   INSERT (<column_list>)
   VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
   DELETE;

Můžete použít pouze prvky příkazu MERGE, které potřebujete. Předpokládejme například, že databáze obsahuje tabulku aktualizací fázované faktury, která zahrnuje kombinaci revizí existujících faktur a nových faktur. Pomocí klauzulí WHEN MATCHED a WHEN NOT MATCHED můžete podle potřeby aktualizovat nebo vložit data faktury.

MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
    UPDATE SET i.CustomerID = s.CustomerID,
                i.OrderDate = GETDATE(),
                i.PurchaseOrderNumber = s.PurchaseOrderNumber,
                i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
    INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
    VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);