Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come AGGIORNARE da SELECT in SQL Server

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.