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.