Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como atualizar de SELECT no SQL Server


Na maioria das circunstâncias, as atualizações do SQL são realizadas usando referências diretas para uma tabela em particular (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1 ). No entanto, ocasionalmente, pode ser benéfico alterar o conteúdo de uma tabela indiretamente , usando um subconjunto de dados obtidos da instrução de consulta secundária.

Executando um UPDATE usando um SELECT secundário A instrução pode ser realizada de duas maneiras, principalmente dependendo de qual versão do SQL Server você está usando. Vamos explorar brevemente ambas as opções para que você possa encontrar o que funciona melhor para você.

Usando INNER JOINS


Para todas as instalações do SQL Server, o método mais básico de executar essa ação é usar um INNER JOIN , em que os valores nas colunas de duas tabelas diferentes são comparados entre si.
UPDATE
  books
SET
  books.primary_author = authors.name
FROM
  books
INNER JOIN
  authors
ON
  books.author_id = authors.id
WHERE
  books.title = 'The Hobbit'

No exemplo acima, estamos UPDATING o books.primary_author campo para corresponder ao authors.name para 'O Hobbit' por JOINING ambas as tabelas na consulta para seus respectivos valores correspondentes de authors.id e books.author_id .

Usando MERGE para ATUALIZAR e INSERT simultaneamente


Para o SQL Server 2008 e mais recente, a Microsoft introduziu o excepcionalmente útil MERGE operação que é semelhante ao INNER JOIN acima método, mas MERGE tenta executar um UPDATE e um INSERT comando juntos. Isso sincroniza efetivamente as duas tabelas com base na consulta realizada, atualizando e inserindo registros conforme necessário para que as duas correspondam.
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)

A consulta completa ao usar MERGE é certamente um pouco mais complexo do que um INNER JOIN básico , mas depois de entender como a operação funciona, você entenderá rapidamente o quão poderoso esse recurso pode realmente ser.

As primeiras linhas são bastante autoexplicativas:
MERGE INTO
  books
USING
  authors
ON
  books.author_id = authors.id

Queremos MERGE INTO (UPDATE /INSERT ) os books tabela usando os authors secundários tabela, e estamos combinando os dois com base no mesmo books.author_id = authors.id comparação.

Onde o MERGE command difere está na lógica de ramificação que segue.
WHEN MATCHED THEN
  UPDATE SET
    books.primary_author = authors.name

Aqui estamos pedindo que o SQL execute uma ação somente quando os registros MATCHED – quando um registro existente é encontrado. Nesse caso, realizamos um UPDATE padrão exatamente como fizemos antes, definindo o books.primary_author campo para igualar o authors.name campo.

Por fim, se a consulta descobrir um registro comparativo correspondente que não existem, em vez disso, executamos um INSERT .
WHEN NOT MATCHED THEN
  INSERT
    (books.author_id, books.primary_author)
  VALUES
    (authors.id, authors.name)

Aqui estamos simplesmente pedindo ao SQL para INSERT um novo registro nos books tabela e passando os valores para o author_id e primary_author campos, obtidos dos authors associados registro da tabela.

O resultado final do nosso MERGE declaração é que para todo autor em authors tabela, verificamos se existe um livro correspondente em books . Se um registro for encontrado, garantimos que books.primary_author é definido usando UPDATE , e onde nenhuma correspondência for encontrada, adicionamos um novo registro a books .

Com isso, você deve ter uma sólida compreensão de dois métodos diferentes que podem ser usados ​​para UPDATE registros em SQL usando SELECT secundário e comparativo declarações.