Corso
Dati coerenti sono fondamentali per l’affidabilità e l’integrità nei database relazionali. Quando modifichi dati esistenti tra tabelle correlate, usiamo l’istruzione UPDATE con la clausola JOIN per ottenere coerenza dei dati. L’operazione UPDATE con JOIN è supportata in SQL Server ed è utile per garantire una sincronizzazione accurata dei dati tra le tabelle.
L’operazione JOIN in SQL consente aggiornamenti più complessi oltre le operazioni su singola tabella tramite chiavi esterne condivise tra tabelle diverse. L’UPDATE con JOIN è utile per sviluppatori e amministratori di database perché migliora l’efficienza e riduce il rischio di inconsistenze nei dati.
Prima di iniziare, ti consiglio il corso di DataCamp Introduction to SQL Server per familiarizzare con il funzionamento dei database SQL Server. Questo tutorial è scritto specificamente pensando a SQL Server. Dai anche un’occhiata al nostro tutorial, Introduction to SQL Joins, per imparare a usare i JOIN quando lavori con più tabelle in SQL.
Come usare SQL UPDATE con JOIN
In SQL Server, l’operazione UPDATE con JOIN ti permette di aggiornare i record in una tabella in base ai dati corrispondenti presenti in un’altra. Questa tecnica è particolarmente utile quando sincronizzi dati tra più tabelle.
Usare SQL UPDATE con INNER JOIN
L’INNER JOIN in SQL recupera le righe/record con dati corrispondenti in entrambe le tabelle. Usato con l’istruzione UPDATE, un INNER JOIN garantisce che vengano aggiornati solo i record nella tabella di destinazione che hanno corrispondenze nella tabella unita.
La struttura tipica di UPDATE con INNER JOIN prevede di specificare la tabella di destinazione da aggiornare e definire le colonne da modificare. La struttura include anche l’uso di INNER JOIN per collegarla a un’altra tabella in base a una colonna comune, in modo da aggiornare solo i record necessari.
Esempio di INNER JOIN
Supponi di gestire un database retail in cui devi aggiornare la tabella Sales per sincronizzarla con le modifiche nella tabella Customer. Un cliente ha recentemente cambiato il metodo di contatto preferito e vuoi che queste modifiche si riflettano in entrambe le tabelle. Userai UPDATE con INNER JOIN per assicurarti che vengano modificati solo i record di vendita relativi ai clienti che hanno aggiornato le informazioni di contatto, senza influenzare le altre righe nei dati.
-- Update the Sales table based on the new preferred contact methods in the Customers table
UPDATE s
SET s.ContactMethod = c.PreferredContactMethod
FROM Sales s
INNER JOIN Customers c ON s.CustomerID = c.CustomerID
WHERE c.CustomerID IN (3, 7, 9);
Best practice per UPDATE con INNER JOIN
Quando usi UPDATE con INNER JOIN, considera le seguenti best practice per query efficienti.
-
Usa indici sulle colonne di join: assicurati che le colonne usate nella condizione di
JOINsiano indicizzate per ottimizzare le prestazioni e velocizzare l’esecuzione della query. -
Limita l’ambito dell’update: usa la clausola
WHEREper assicurarti che vengano aggiornate solo le righe rilevanti e per migliorare le prestazioni della query.
Usare SQL UPDATE con LEFT JOIN
Un LEFT JOIN viene usato per recuperare tutti i record dalla tabella di sinistra (prima) e i record corrispondenti dalla tabella di destra (seconda). Una query con LEFT JOIN restituirà risultati NULL dalla tabella di destra se non ci sono corrispondenze. Usato con l’istruzione UPDATE, il LEFT JOIN può aggiornare i record anche quando non ci sono dati corrispondenti nella seconda tabella, utile per colmare dati mancanti. Dai un’occhiata al nostro SQL Joins Cheat Sheet se vuoi ripassare i join in SQL.
Esempio di LEFT JOIN
Considera lo scenario in cui gestisci un database per un negozio online. La tabella Customers contiene l’elenco di tutti i clienti, mentre la tabella Orders contiene i dettagli degli ordini effettuati da alcuni di questi clienti. Userai il LEFT JOIN per recuperare e aggiornare i dettagli degli ordini per tutti i clienti, compresi quelli che non hanno ancora effettuato ordini. Questo metodo riempirà i dati mancanti per i clienti senza ordini con un valore NULL o con un valore specificato.
Il nostro esempio con LEFT JOIN sarà un po’ diverso perché LEFT JOIN restituisce valori NULL se non vengono trovati record corrispondenti nella tabella di destra. Per questo è importante capire come gestire questi valori NULL. Puoi gestire i valori NULL impostando un valore predefinito nelle colonne da aggiornare. Usando la funzione COALESCE(), il LEFT JOIN includerà una condizione per un valore di default per i dati mancanti. La query seguente mostra come impostare un valore di default per i valori NULL.
-- Update all customers to set default values where OrderStatus and OrderDate are NULL
UPDATE c
SET
c.OrderStatus = COALESCE(o.OrderStatus, 'No Orders'),
c.OrderDate = COALESCE(o.OrderDate, '2023-01-01')
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
-- Select from the updated Customers table
SELECT *
FROM Customers;
Puoi anche usare le funzioni COALESCE() o IFNULL() per gestire i valori NULL che coinvolgono calcoli prima di aggiornare le colonne. Dai un’occhiata al nostro tutorial COALESCE() SQL Function per saperne di più.
Best practice per UPDATE con LEFT JOIN
Quando usi UPDATE con LEFT JOIN, considera le seguenti best practice per query efficienti.
-
Usa riferimenti espliciti alle colonne: invece di usare
SELECT *, specifica esplicitamente le colonne che vuoi aggiornare per rendere la query più chiara ed evitare aggiornamenti indesiderati. -
Usa indici sulle colonne di join: assicurati che le colonne usate nella condizione di
JOINsiano indicizzate per migliorare le prestazioni delJOINe il tempo complessivo di esecuzione della query.
Considerazioni sulle prestazioni di SQL UPDATE con JOIN
Capire le implicazioni sulle prestazioni quando si usa UPDATE con JOIN in SQL è importante per assicurare che le query vengano eseguite in modo efficiente. Le prestazioni di queste operazioni possono essere influenzate da diversi fattori, tra cui la dimensione delle tabelle, il tipo di join utilizzato e la presenza di indici appropriati.
Indici e velocità delle query
Indicizzare le colonne coinvolte nella condizione di join è importante per velocizzare il processo di aggiornamento. Quando indicizzi correttamente le colonne, l’operazione individua solo le righe corrispondenti durante il join, riducendo il tempo necessario per la scansione della tabella.
Impatto di dataset di grandi dimensioni
Quando lavori con dataset di grandi dimensioni, l’esecuzione delle query può essere più lenta a causa di operazioni ad alta intensità di risorse. Considera le seguenti best practice per mitigare i problemi di prestazioni con dataset grandi. Prova anche lo skill track SQL Server for Database Administrators se progetterai o manterrai database regolarmente come parte del tuo lavoro.
-
Aggiornamenti a batch: suddividi gli aggiornamenti in batch più piccoli per ridurre il carico sul database e aggiornare i record in modo efficiente.
-
Limita l’ambito dell’update: quando usi la clausola
WHERE, specifichi le righe da aggiornare, riducendo il tempo di elaborazione delle query.
Errori comuni e come evitarli
Ci sono alcuni errori comuni che potresti incontrare quando usi UPDATE con JOIN in SQL Server. Questi errori possono portare a problemi di prestazioni o ad aggiornare dati non intenzionali. Di seguito alcuni di questi errori e come evitarli.
Aggiornamenti non intenzionali
Se non specifichi correttamente la condizione di join, l’UPDATE con JOIN aggiornerà più record del previsto. Questo errore può aggiornare un’intera tabella invece del sottoinsieme richiesto. Per evitarlo, assicurati sempre di usare una condizione di JOIN precisa per aggiornare le righe necessarie.
Prodotti cartesiani
Un prodotto cartesiano si verifica quando la condizione di join è errata o mancante, causando l’abbinamento di ogni riga della tabella di sinistra con ogni riga della tabella di destra. Questo problema può rallentare l’operazione della query e produrre risultati inaccurati. Per evitarlo, assicurati sempre di definire correttamente la condizione di JOIN. Inoltre, indica le colonne corrette su cui applicare la condizione di join.
Alternative a SQL UPDATE con JOIN
Sebbene l’UPDATE con JOIN sia un metodo potente per aggiornare record tra tabelle correlate, esistono metodi alternativi per ottenere lo stesso risultato. Ecco alcune opzioni.
Sottoquery
Le sottoquery sono un’alternativa importante al JOIN quando vuoi eseguire aggiornamenti basati su una condizione semplice. Con le sottoquery eviti tabelle multiple complesse specificando la condizione nella sottoquery.
L’esempio seguente mostra come usare una sottoquery per aggiornare la tabella Sales con il CustomerStatus più recente dalla tabella Customers.
-- Update the CustomerStatus in the Sales table
UPDATE Sales
-- Set the CustomerStatus in Sales to corresponding value from the Customers table
SET CustomerStatus = (
-- Fetch CustomerStatus from the Customers table for the matching CustomerID
SELECT CustomerStatus
FROM Customers
WHERE Customers.CustomerID = Sales.CustomerID
)
-- Update rows in Sales where a matching CustomerID exists in the Customers table
WHERE EXISTS (
-- Subquery to check if a matching CustomerID exists in the Customers table
SELECT 1
FROM Customers
WHERE Customers.CustomerID = Sales.CustomerID
);
Istruzione MERGE
L’istruzione MERGE è un comando SQL versatile che consente di eseguire operazioni di UPDATE, INSERT o DELETE in un’unica query confrontando due tabelle. L’istruzione MERGE è utile quando devi sincronizzare dati tra due tabelle, gestendo righe corrispondenti e non corrispondenti.
Usare l’istruzione MERGE è utile perché offre un metodo conciso per eseguire più operazioni in un’unica query. La sintassi dell’istruzione MERGE è la seguente.
-- Merge data from the source table into the target table
MERGE INTO target_table AS target
USING source_table AS source
-- Define the common key between the source and target tables
ON target.common_column = source.common_column
-- When a match is found in both tables based on the common key
WHEN MATCHED THEN
-- Update the target table's column with the corresponding value from the source table
UPDATE SET target.column = source.column
-- When a row exists in the source table but not in the target table
WHEN NOT MATCHED THEN
-- Insert the new data into the target table
INSERT (column1, column2)
VALUES (source.column1, source.column2)
-- When a row exists in the target table but not in the source table
WHEN NOT MATCHED BY SOURCE THEN
-- Delete the row from the target table
DELETE;
Conclusione
Capire come usare UPDATE con JOIN in SQL Server è importante per aggiornamenti di dati tra tabelle efficienti nei database relazionali. Questa tecnica ti permette di aggiornare i record in una tabella in base ai dati corrispondenti in un’altra, garantendo coerenza e sincronizzazione dei dati tra tabelle correlate. Applicare queste tecniche e best practice può migliorare le operazioni sui database, assicurando una gestione dei dati accurata, efficiente e affidabile.
Se vuoi far progredire le tue competenze SQL, ti consiglio lo skill track di DataCamp SQL Server Fundamentals per migliorare le tue capacità di analisi dei dati. Il corso Writing Functions and Stored Procedures in SQL Server ti aiuterà anche a imparare una manipolazione efficiente dei dati in SQL Server. Se ti stai preparando per un colloquio SQL, ti consiglio di leggere il nostro post sul blog, 20 Top SQL Joins Interview Questions, per aiutarti a prepararti. Infine, se vuoi applicare le tue competenze SQL in una carriera come data engineer, considera anche il nostro career track Data Engineer in Python, completo di certificazione finale.
Domande frequenti su SQL
Qual è lo scopo di usare UPDATE con JOIN in SQL?
UPDATE con JOIN ti permette di aggiornare i record in una tabella in base ai dati corrispondenti presenti in un’altra tabella.
In che cosa differisce un INNER JOIN da un LEFT JOIN quando si usa in un’istruzione UPDATE?
Un INNER JOIN aggiorna solo i record che hanno righe corrispondenti in entrambe le tabelle, mentre un LEFT JOIN aggiorna tutti i record nella tabella di destinazione, inclusi quelli che non hanno una riga corrispondente nella tabella unita, colmando i dati mancanti o gestendo i valori NULL.
Quali sono i problemi di prestazioni di UPDATE con JOIN in SQL?
Tabelle/dataset di grandi dimensioni possono influenzare le prestazioni della query di UPDATE con JOIN poiché richiedono maggiore potenza di elaborazione.
Quali database supportano UPDATE con JOIN in SQL?
Il concetto di UPDATE con JOIN funziona in SQL Server, MySQL e PostgreSQL, anche se la sintassi varia a seconda del database. Oracle non supporta direttamente UPDATE con JOIN e richiede un approccio diverso usando sottoquery o l’istruzione MERGE.
Quali sono le alternative a UPDATE con JOIN in SQL?
L’uso di sottoquery o dell’istruzione MERGE sono alternative appropriate a UPDATE con JOIN.


