Slå sammen data basert på flere tabeller
I databaseoperasjoner er det noen ganger behov for å utføre en SQL MERGE-operasjon. Med dette DML-alternativet kan du synkronisere to tabeller ved å sette inn, oppdatere eller slette rader i én tabell basert på forskjeller i den andre tabellen. Tabellen som endres, kalles måltabellen . Tabellen som brukes til å bestemme hvilke rader som skal endres, kalles kildetabellen .
MERGE endrer data basert på én eller flere betingelser:
- Når kildedataene har en samsvarende rad i måltabellen, kan de oppdatere data i måltabellen.
- Når kildedataene ikke samsvarer med målet, kan de sette inn data i måltabellen.
- Når måldataene ikke samsvarer i kilden, kan de slette måldataene.
Den generelle syntaksen for en MERGE-setning vises nedenfor. Vi samsvarer med målet og kilden i en angitt kolonne, og hvis det er et treff mellom mål og kilde, angir vi en handling som skal utføres på måltabellen. Hvis det ikke finnes et treff, angir vi en handling. Handlingen kan være en INSERT-, UPDATE- eller DELETE-operasjon. Denne koden indikerer at en OPPDATERING utføres når det er et samsvar mellom kilden og målet. En INSERT utføres når det er data i kilden uten samsvarende data i målet. Til slutt utføres en DELETE når det er data i målet uten treff i kilden. Det finnes mange andre mulige former for en MERGE-setning.
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;
Du kan bare bruke elementene i MERGE-setningen du trenger. Anta for eksempel at databasen inneholder en tabell med trinnvise fakturaoppdateringer, som inkluderer en blanding av revisjoner av eksisterende fakturaer og nye fakturaer. Du kan bruke SETNINGENE WHEN MATCHED og WHEN NOT MATCHED til å oppdatere eller sette inn fakturadata etter behov.
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);