Unire i dati basati su più tabelle
Nelle operazioni di database è talvolta necessario eseguire un'operazione SQL MERGE. Questa opzione DML consente di sincronizzare due tabelle inserendo, aggiornando o eliminando righe in una tabella in base alle differenze trovate in un'altra tabella. La tabella che viene modifica è denominata tabella di destinazione. La tabella usata per determinare le righe da modificare è denominata tabella di origine.
MERGE modifica i dati in base a una o più condizioni:
- Quando i dati di origine hanno una riga corrispondente nella tabella di destinazione, possono aggiornare i dati nella tabella di destinazione.
- Quando i dati di origine non hanno alcuna corrispondenza nella destinazione, possono inserire dati nella tabella di destinazione.
- Quando i dati di destinazione non hanno alcuna corrispondenza nell'origine, possono eliminare i dati di destinazione.
Di seguito è riportata la sintassi generale di un'istruzione MERGE. Si sta cercando una corrispondenza tra la destinazione e l'origine in una colonna specificata e, se dovesse essere presente, viene specificata un'azione da eseguire nella tabella di destinazione. Se non è presente alcuna corrispondenza, viene specificata un'azione. L'azione può essere un'operazione INSERT, UPDATE o DELETE. Questo codice indica che un'istruzione UPDATE viene eseguita quando esiste una corrispondenza tra l'origine e la destinazione. Un'istruzione INSERT viene eseguita quando sono presenti dati nell'origine senza dati corrispondenti nella destinazione. Infine, viene eseguita un'istruzione DELETE quando nella destinazione sono presenti dati senza corrispondenza nell'origine. Esistono molte altre forme possibili di un'istruzione 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;
È possibile usare solo gli elementi necessari dell'istruzione MERGE. Si supponga, ad esempio, che il database includa una tabella di aggiornamenti a fasi delle fatture, che comprende una combinazione di revisioni per le fatture esistenti e quelle nuove. È possibile usare le clausole WHEN MATCHED e WHEN NOT MATCHED per aggiornare o inserire i dati della fattura in base alle esigenze.
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);