In questo articolo verranno illustrati i diversi metodi per l'utilizzo dell'istruzione UPDATE da SELECT in SQL Server.
Nel mondo dei database, i dati statici non vengono generalmente archiviati. Invece, continua a cambiare quando aggiorniamo i dati esistenti, archiviamo o cancelliamo dati irrilevanti e altro ancora. Ad esempio, supponiamo che tu abbia una tabella che memorizza i dati sui prezzi dei prodotti per il tuo portale di shopping. I prezzi dei prodotti cambiano costantemente, poiché potresti offrire sconti sui prodotti in momenti diversi ai tuoi clienti. In questo caso, non puoi aggiungere nuove righe nella tabella perché il record del prodotto esiste già, ma devi aggiornare i prezzi correnti per i prodotti esistenti.
È qui che entra in gioco la query UPDATE. La query UPDATE modifica i dati in una riga esistente nel database. È possibile aggiornare tutte le righe della tabella o limitare le righe interessate per l'aggiornamento utilizzando la clausola WHERE. Di solito, gli aggiornamenti SQL vengono eseguiti per una tabella esistente con riferimento diretto. Ad esempio, in una tabella [dipendente], un requisito deve aumentare lo stipendio di tutti i dipendenti attivi del 10%. In questo caso, la query SQL di riferimento diretto sarà:
Aggiorna set dipendenti [stipendio]=stipendio + (stipendio * 10 / 100) dove [attivo]=1
Si supponga di avere un'altra tabella [Indirizzo] che memorizza le posizioni dei dipendenti e che sia necessario aggiornare la tabella [Dipendente] in base ai dati disponibili nella tabella [Indirizzo]. Come si aggiornano i dati nella tabella [Dipendente]?
Fortunatamente, c'è una soluzione:UPDATE dall'istruzione SELECT. Nella sezione seguente, esamineremo diversi modi per eseguire gli aggiornamenti utilizzando un'istruzione SELECT. Ad esempio, la tabella [Employee] ha valori NULL per le colonne – [PostCode] e [City] nello screenshot seguente. La tabella [Indirizzo] ha valori per entrambe le colonne [Codice postale] e [Città].
Metodo 1:AGGIORNAMENTO da SELECT:metodo di adesione
Questo metodo utilizza i join SQL per fare riferimento alla tabella secondaria che contiene i valori che devono essere aggiornati. Pertanto, la tabella di destinazione viene aggiornata con i dati delle colonne di riferimento per le condizioni specificate.
È piuttosto semplice utilizzare l'istruzione UPDATE da SELECT in questo caso. Puoi prima utilizzare l'istruzione SELECT per recuperare la colonna di riferimento e i valori della colonna di destinazione.
SELECT e.City,A.City, e.PostCode,A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Successivamente, eseguirai lievi modifiche alla tua query e preparerà un'istruzione UPDATE come mostrato di seguito.
- Sostituisci la parola chiave select con update.
- Specifica il nome della tabella o il nome alias che deve essere aggiornato.
- Utilizza una parola chiave impostata e il simbolo di uguale (=) tra le colonne di riferimento e di destinazione.
UPDATE e set e.City=A.City, e.PostCode=A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Quindi eseguire l'istruzione UPDATE e verificare che i valori della colonna di origine e di destinazione siano gli stessi.
Metodo 2:UPDATE da SELECT:l'istruzione MERGE
L'istruzione MERGE è utile per manipolare i dati nella tabella di destinazione in base ai dati della tabella di origine per le righe corrispondenti e non corrispondenti. È un metodo alternativo per eseguire UPDATE dalla funzione dell'istruzione SELECT.
Nell'istruzione MERGE di esempio di seguito, vengono eseguite le seguenti attività:
- Utilizzare un'istruzione MERGE per aggiornare i dati nella tabella [Impiegato].
- Fa quindi riferimento a un'altra tabella quando viene applicata la clausola USING.
- WHEN MATCHED specifica quindi l'unione JOIN (Inner Join) tra la tabella di origine e quella di destinazione.
- Quindi aggiorna [Codice postale] e [Città] dalla tabella [Indirizzo] alla tabella [Dipendente] utilizzando l'istruzione THEN UPDATE seguita dai mapping delle colonne di origine e di destinazione.
- L'istruzione MERGE termina sempre con un punto e virgola(;).
MERGE Employee AS e USING(SELECT * FROM [Address]) AS A ON A.EmpID=e.EmpID WHEN MATCHED THEN UPDATE SET e.PostCode=A.PostCode , e.City = A.City;
Metodo 3:AGGIORNAMENTO da SELECT:metodo di sottoquery
La sottoquery definisce una query interna che può essere utilizzata all'interno di un'istruzione SELECT, INSERT, UPDATE e DELETE. È un metodo semplice per aggiornare i dati delle tabelle esistenti da altre tabelle.
UPDATE Employee SET Employee.City=(SELECT [Address].city FROM [Address] WHERE [Address].EmpID = Employee.EmpId)
- La query precedente utilizza un'istruzione SELECT nella clausola SET dell'istruzione UPDATE.
- Se la sottoquery trova una riga corrispondente, la query di aggiornamento aggiorna i record per il dipendente specifico.
- Se la sottoquery restituisce NULL (nessuna riga corrispondente), aggiorna NULL per la rispettiva colonna.
- Se la sottoquery restituisce più di una riga corrispondente, l'istruzione UPDATE genera un errore:"SQL Server Subquery ha restituito più di 1 valore. Ciò non è consentito quando la sottoquery utilizza operatori di confronto (=, !=, <, <=,>,>=).”
Limiti per le sottoquery
- La sottoquery con un operatore di confronto può includere solo un nome di colonna, a meno che non sia utilizzata per l'operatore IN o EXISTS. Pertanto, se è necessario aggiornare più colonne di dati, sono necessarie istruzioni SQL separate.
- Non puoi utilizzare ntext , testo e immagine tipi di dati nella sottoquery.
- La sottoquery non può includere GROUP BY e la clausola HAVING se la sottoquery contiene un operatore di confronto non modificato. L'operatore di confronto non modificato non può utilizzare la parola chiave ANY o ALL.
Confronto delle prestazioni tra diverse istruzioni UPDATE da SELECT
In questa sezione, faremo il confronto delle prestazioni tra diversi metodi UPDATE da SELECT. Per fare ciò, inizieremo eseguendo le query SQL insieme, abilitando il piano di esecuzione effettivo (Ctrl + M) in SQL Server Management Studio e separandole utilizzando l'istruzione Go.
Nei piani di esecuzione, ottengo i seguenti dati per la mia demo:
- Il metodo di unione ha un costo della query del 41% (rispetto al batch complessivo)
- L'istruzione MERGE ha un costo della query del 34% (rispetto al batch complessivo)
- Il metodo della sottoquery ha un costo della query del 24% (rispetto al batch complessivo)
Il metodo JOIN utilizza un costo del 40% per l'ordinamento distinto e un costo del 35% per l'aggiornamento dell'indice cluster.
Il merge join utilizza un inner join per la corrispondenza delle righe di dati tra i dati di origine e di destinazione. Ha anche il costo relativo massimo per l'operatore di smistamento.
La sottoquery è il metodo più veloce per aggiornare i dati delle colonne. Utilizza l'aggiornamento dell'indice cluster e la scansione dell'indice cluster come evidenziato.
Per maggiori dettagli, puoi fare riferimento ai miei articoli precedenti: Piano di esecuzione di SQL Server:che cos'è e in che modo aiuta con i problemi di prestazioni? e Come leggere e analizzare i piani di esecuzione di SQL Server.
Riepilogo
È possibile utilizzare qualsiasi metodo specificato in questo articolo per eseguire UPDATE dalle istruzioni SELECT. La sottoquery funziona in modo efficiente, ma ha i suoi limiti, come evidenziato in precedenza. Le prestazioni complessive del database dipendono dai dati della tabella, dal numero di aggiornamenti, dalle relazioni tra tabelle, indici e statistiche.