update con Sql

Update SQL: la guida completa per tutti i principali RDBMS

Lo scopo di questo articolo è di riportare in un solo posto la sintassi per eseguire un Update con il linguaggio SQL su tutti i principali RDBMS (Relational Database Management System) sia nella versione base e sia nel caso in cui la query richieda una join con una seconda tabella. Vedremo in particolare i database Sql Server, Oracle, MySql e Access.

Per la versione base la sintassi è comune a tutti i principali RDBMS. Supponiamo ad esempio di dover incrementare del dieci per cento l’importo della fattura numero 1. Scriveremo

UPDATE  Fatture

SET            Importo = Importo * 1.1

WHERE    IdFattura=1

Vedremo invece che la versione dell’update “con join” varia abbastanza tra un RDBMS e l’altro, per quanto si tratta di una tipologia di query da scrivere abbastanza frequentemente. Tali diversità causano spesso frustrazione per uno sviluppatore SQL che scrive codice su più ambienti o per un junior che non riesce a trovare la sintassi giusta per il proprio database. In questo articolo cercheremo di porre fine a questa situazione declinando su Sql Server, Oracle, Access e MySql il seguente esercizio:

“incrementare del dieci per cento l’importo delle fatture dei clienti residenti in Lombardia”

 

Update su Sql Server

Su Sql Server occorre specificare subito dopo la parola UPDATE la tabella che si vuole aggiornare. In seguito occorre valorizzare la clausola SET. In essa non è possibile indicare la tabella a cui appartiene la colonna da aggiornare a sinistra dell’uguale. Essa infatti sarà definita implicitamente dalla tabella indicata dopo l’Update nella prima riga. Dopo la SET, sarà presente la clausola FROM che conterrà obbligatoriamente la tabella indicata dopo l’UPDATE, oltre ad eventuali ulteriori tabelle collegate tramite una JOIN.

Il codice sarà dunque

UPDATE Fatture
SET          Importo = F.Importo * 1.1
FROM     Fatture AS F
INNER JOIN Clienti AS C
      ON     F.IdCliente = C.IdCliente
WHERE  C.RegioneResidenza = ‘Lombardia’;

Nulla cambierebbe se volessimo aggiornare la colonna della tabella Fatture con un valore presente nella tabella Clienti. Risulta fondamentale notare che nel caso in cui IdCliente non fosse chiave primaria della tabella Clienti, sarebbe eseguito comunque un solo update non deterministico per le fatture associate a IdClienti duplicati.

 

Update con PL/SQL su Oracle

Come accennato nell’introduzione dell’articolo, la sintassi precedente non funziona su Oracle. In questo articolo https://oracle-base.com/articles/misc/updates-based-on-queries potete trovare vari metodo per eseguire questa tipologia di join, vi riporto quello secondo me più semplice che utilizza la MERGE.

MERGE INTO Fatture F
USING              (SELECT * FROM Clienti WHERE  RegioneResidenza=’Lombardia’ ) C
         ON            (F.IdCliente= C.IdCliente)
WHEN MATCHED THEN
UPDATE SET F.Importo = F.Importo * 1.1;

Ricordo che secondo le impostazioni di default, su Oracle occorre eseguire esplicitamente una Commit per confermare l’update.

Nel caso in cui ci fossero più righe della tabella specificata nella Using con lo stesso IdCliente, la query precedente fallirebbe con errore “unable to get a stable set of rows in the source tables ORA-06512”

 

Update su MySql

Su MySql possiamo usare una sintassi simile a quella di SQL Server, ma non del tutto identica. Infatti non possiamo inserire una clausola FROM, ma dobbiamo scrivere la join direttamente nell’Update. Risulterà fondamentale specificare la tabella di appartenenza della colonna da modificare.

Il codice sarà dunque

UPDATE              Fatture F 
INNER JOIN      Clienti AS C
      ON     F.IdCliente = C.IdCliente
SET                        F.Importo = F.Importo * 1.1
WHERE                C.RegioneResidenza=’Lombardia’;

Come su SQL Server, nel caso ipotetico in cui ci siano più IdClienti all’interno della tabella Clienti, MySql esegue comunque un solo update non deterministico per le fatture associate a righe duplicate.

 

Update SQL su Access

Su Access possiamo usare la stessa sintassi di MySql. Occorre però porre molta attenzione nel caso in cui l’IdCliente è ripetuto più volte nella tabella Clienti. A differenza di Sql Server e di MySql, Microsoft Access esegue l’update (e quindi in questo caso l’incremento del dieci per cento) più di una volta. Vediamo un esempio concreto.

Tabella1

CAMPO1 CAMPO2
1 10

Tabella2

CAMPO1
1
1

Dopo la query

UPDATE         TABELLA1 AS A
INNER JOIN TABELLA2 AS B
      ON   A.Campo1=B.Campo1
SET                  A.Campo2 = A.Campo2 * 1.1 

nella colonna Campo2 della Tabella1 sarà riportato il valore 12.1 proveniente da un doppio Update.

 

Join con SQL

A questo link ho approfondito i passi da seguire per scrivere correttamente le Join in SQL.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Torna su