Nella maggior parte dei casi, gli aggiornamenti SQL vengono eseguiti utilizzando riferimenti diretti a una tabella particolare (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Tuttavia, a volte, può rivelarsi utile modificare il contenuto di una tabella indirettamente , utilizzando un sottoinsieme di dati ottenuto dall'istruzione di query secondaria.
Esecuzione di un UPDATE
utilizzando un SELECT
secondario L'istruzione può essere eseguita in due modi, principalmente a seconda della versione di SQL Server in uso. Esploreremo brevemente entrambe le opzioni in modo che tu possa trovare quella che funziona meglio per te.
Utilizzo di INNER JOINS
Per tutte le installazioni di SQL Server, il metodo più semplice per eseguire questa azione consiste nell'usare un INNER JOIN
, per cui i valori nelle colonne di due tabelle diverse vengono confrontati tra loro.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
Nell'esempio sopra, stiamo UPDATING
il books.primary_author
campo in modo che corrisponda a authors.name
per "Lo Hobbit" di JOINING
entrambe le tabelle nella query ai rispettivi valori corrispondenti di authors.id
e books.author_id
.
Utilizzo di UNISCI per AGGIORNARE e INSERIRE contemporaneamente
Per SQL Server 2008 e versioni successive, Microsoft ha introdotto l'eccezionalmente utile MERGE
operazione simile alla precedente INNER JOIN
metodo, ma MERGE
tenta di eseguire sia un UPDATE
e un INSERT
comandare insieme. Questo sincronizza efficacemente le due tabelle in base alla query eseguita, aggiornando e inserendo i record necessari affinché le due corrispondano.
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
La query completa quando si utilizza MERGE
è sicuramente un po' più complesso di quello di un INNER JOIN
di base , ma una volta compreso come funziona l'operazione, capirai subito quanto può essere davvero potente questa capacità.
Le prime righe sono piuttosto autoesplicative:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Vogliamo MERGE INTO
(UPDATING
/INSERT
) i books
tabella utilizzando gli authors
secondari tabella e abbiniamo i due in base allo stesso books.author_id = authors.id
confronto.
Dove il MERGE
comando differisce è nella logica di ramificazione che segue.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Qui chiediamo a SQL di eseguire un'azione solo quando registra MATCHED
– quando viene trovato un record esistente. In tal caso, eseguiamo un UPDATE
standard proprio come abbiamo fatto prima, impostando il books.primary_author
campo in modo che sia uguale a authors.name
campo.
Infine, se la query rileva un record comparativo corrispondente, ciò non esiste, eseguiamo invece un INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Qui stiamo semplicemente chiedendo a SQL di INSERT
un nuovo record nei books
tabella e passando i valori per author_id
e primary_author
campi, prelevati dagli authors
associati record della tabella.
Il risultato finale del nostro MERGE
affermazione è quella per ogni autore in authors
tabella, verifichiamo se esiste un libro corrispondente in books
. Se viene trovato un record, garantiamo books.primary_author
viene impostato utilizzando UPDATE
e se non viene trovata alcuna corrispondenza, aggiungiamo un nuovo record a books
.
Con ciò, dovresti avere una solida conoscenza di due diversi metodi che possono essere utilizzati per UPDATE
record in SQL utilizzando SELECT
secondario e comparativo dichiarazioni.