Comando SQL Merge: tre in uno
Il comando MERGE in SQL su IBM iSeries è utilizzato per sincronizzare dati tra tabelle, combinando operazioni di INSERT, UPDATE o DELETE in un’unica istruzione.
Questo comando è particolarmente utile quando si deve aggiornare una tabella target con informazioni provenienti da un’altra tabella o sorgente ed esiste una corrispondenza tra i dati della sorgente e quelli del target.
In questi casi (esiste una corrispondenza tra i dati della sorgente e quelli del target), il comando MERGE è molto potente perché consente di eseguire tutte e tre queste operazioni in un’unica istruzione, in base alle condizioni specificate, ovvero l’istruzione MERGE potrà eseguire:
- un aggiornamento dell’occorrenza target se esiste corrispondenza delle colonne identificative tra source e target ed è soddisfatta la ulteriore condizione di Update;
- una Delete dell’occorrenza target se esiste corrispondenza delle colonne identificative tra source e target ed è soddisfatta la ulteriore condizione di Delete;
- se non esiste corrispondenza (dati presenti solo su source), inserirà i nuovi dati da source a target.
Di seguito un esempio di come eseguire queste operazioni:
MERGE INTO TargetTable AS TARGET USING SourceTable AS SOURCE ON TARGET.KeyColumn = SOURCE.KeyColumn WHEN MATCHED AND SOURCE.ConditionForUpdate THEN UPDATE SET TARGET.Column1 = SOURCE.Column1, TARGET.Column2 = SOURCE.Column2 WHEN MATCHED AND SOURCE.ConditionForDelete THEN DELETE WHEN NOT MATCHED AND SOURCE.ConditionForInsert THEN INSERT (Column1, Column2) VALUES (SOURCE.Column1, SOURCE.Column2) ELSE IGNORE;
In questo esempio:
- TargetTable è la tabella in cui si desidera inserire, aggiornare o eliminare i dati.
- SourceTable è la tabella sorgente da cui provengono i dati.
- KeyColumn è la colonna utilizzata per confrontare le righe nelle due tabelle (se è necessaria più di una colonna si aggiungono le colonne identificative ulteriori in AND).
- La clausola WHEN MATCHED AND SOURCE.ConditionForUpdate THEN specifica che se esiste una corrispondenza e si verifica una certa condizione (ConditionForUpdate), allora si esegue un UPDATE.
- La clausola WHEN MATCHED AND SOURCE.ConditionForDelete THEN specifica che se esiste una corrispondenza e si verifica un’altra (diversa) condizione (ConditionForDelete), allora si esegue un DELETE.
- La clausola WHEN NOT MATCHED AND SOURCE.ConditionForInsert THEN specifica che se non esiste una corrispondenza e si verifica una certa condizione (ConditionForInsert), allora si esegue un INSERT.
- La clausola ELSE IGNORE evidenzia che se non sono soddisfatte le condizioni WHEN precedenti il record source viene ignorato
Quindi il comando MERGE risolve con eleganza e con un unico comando operazioni che altrimenti richiederebbero diverse istruzioni di insert, update e delete