Gegevens samenvoegen op basis van meerdere tabellen
In databasebewerkingen is het soms nodig om een SQL MERGE-bewerking uit te voeren. Met deze DML-optie kunt u twee tabellen synchroniseren door rijen in te voegen, bij te werken of te verwijderen in één tabel op basis van verschillen in de andere tabel. De tabel die wordt gewijzigd, wordt de doeltabel genoemd. De tabel die wordt gebruikt om te bepalen welke rijen moeten worden gewijzigd, wordt de brontabel genoemd.
SAMENVOEGEN wijzigt gegevens op basis van een of meer voorwaarden:
- Wanneer de brongegevens een overeenkomende rij in de doeltabel hebben, kunnen deze gegevens in de doeltabel bijwerken.
- Wanneer de brongegevens niet overeenkomen met het doel, kunnen deze gegevens invoegen in de doeltabel.
- Wanneer de doelgegevens niet overeenkomen met de bron, kunnen de doelgegevens worden verwijderd.
De algemene syntaxis van een MERGE-instructie wordt hieronder weergegeven. We komen overeen met het doel en de bron in een opgegeven kolom. Als er een overeenkomst is tussen het doel en de bron, geven we een actie op die moet worden uitgevoerd op de doeltabel. Als er geen overeenkomst is, geven we een actie op. De actie kan een INSERT-, UPDATE- of DELETE-bewerking zijn. Deze code geeft aan dat er een UPDATE wordt uitgevoerd wanneer er een overeenkomst is tussen de bron en het doel. Er wordt een INSERT uitgevoerd wanneer er gegevens in de bron staan zonder overeenkomende gegevens in het doel. Ten slotte wordt een DELETE uitgevoerd wanneer er gegevens in het doel staan zonder overeenkomst in de bron. Er zijn veel andere mogelijke vormen van een MERGE-instructie.
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;
U kunt alleen de elementen van de MERGE-instructie gebruiken die u nodig hebt. Stel dat de database een tabel met gefaseerde factuurupdates bevat, met een combinatie van revisies voor bestaande facturen en nieuwe facturen. U kunt de componenten WHEN MATCHED en WHEN NOT MATCHED gebruiken om de factuurgegevens indien nodig bij te werken of in te voegen.
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);