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

Note

Příkaz MERGE používá mechanismy uzamčení, které se liší od diskrétních INSERT, UPDATEa DELETE příkazů. Ve velkém měřítku MERGE může docházet ke složitým problémům se souběžností, takže před nasazením do produkčního prostředí důkladně otestujte všechny MERGE příkazy. Když jednoduše aktualizujete jednu tabulku na základě řádků jiné, samostatné INSERTUPDATEa DELETE příkazy můžou nabídnout lepší výkon a škálovatelnost. Další informace najdete v tématu Důležité informace o souběžnosti funkce MERGE.