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.