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:

  1. TargetTable è la tabella in cui si desidera inserire, aggiornare o eliminare i dati.
  2. SourceTable è la tabella sorgente da cui provengono i dati.
  3. 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).
  4. 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.
  5. 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.
  6. 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.
  7. 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

Articoli simili