Sammanfoga data baserat på flera tabeller
I databasåtgärder finns det ibland ett behov av att utföra en SQL MERGE-åtgärd. Med det här DML-alternativet kan du synkronisera två tabeller genom att infoga, uppdatera eller ta bort rader i en tabell baserat på skillnader som finns i den andra tabellen. Den tabell som ändras kallas för måltabellen. Tabellen som används för att avgöra vilka rader som ska ändras kallas för källtabellen.
MERGE ändrar data baserat på ett eller flera villkor:
- När källdata har en matchande rad i måltabellen kan den uppdatera data i måltabellen.
- När källdata inte har någon matchning i målet kan de infoga data i måltabellen.
- När måldata inte har någon matchning i källan kan de ta bort måldata.
Den allmänna syntaxen för en MERGE-instruktion visas nedan. Vi matchar målet och källan i en angiven kolumn, och om det finns en matchning mellan mål och källa anger vi en åtgärd som ska vidtas i måltabellen. Om det inte finns någon matchning anger vi en åtgärd. Åtgärden kan vara en INSERT-, UPDATE- eller DELETE-åtgärd. Den här koden anger att en UPPDATERING utförs när det finns en matchning mellan källan och målet. En INSERT utförs när det finns data i källan utan matchande data i målet. Slutligen utförs en DELETE när det finns data i målet utan matchning i källan. Det finns många andra möjliga former av en MERGE-instruktion.
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 bara använda elementen i MERGE-instruktionen som du behöver. Anta till exempel att databasen innehåller en tabell med mellanlagrade fakturauppdateringar, som innehåller en blandning av revisioner av befintliga fakturor och nya fakturor. Du kan använda satserna WHEN MATCHED och WHEN NOT MATCHED för att uppdatera eller infoga fakturadata efter 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);