Neste artigo, abordaremos os diferentes métodos para usar a instrução UPDATE from SELECT no SQL Server.
No mundo do banco de dados, os dados estáticos normalmente não são armazenados. Em vez disso, ele continua mudando quando atualizamos dados existentes, arquivamos ou excluímos dados irrelevantes e muito mais. Por exemplo, digamos que você tenha uma tabela que armazena dados de preços de produtos para seu portal de compras. Os preços dos produtos mudam constantemente, pois você pode oferecer descontos de produtos em momentos diferentes para seus clientes. Nesse caso, você não pode adicionar novas linhas na tabela porque o registro do produto já existe, mas é necessário atualizar os preços atuais dos produtos existentes.
É aqui que a consulta UPDATE entra em ação. A consulta UPDATE modifica os dados em uma linha existente no banco de dados. Você pode atualizar todas as linhas da tabela ou limitar as linhas afetadas para a atualização usando a cláusula WHERE. Normalmente, as atualizações de SQL são executadas para uma tabela existente com referência direta. Por exemplo, em uma tabela [employee], um requisito deve aumentar o salário de todos os funcionários ativos em 10%. Nesse caso, a consulta SQL de referência direta será:
Atualizar o conjunto de funcionários [salário]=salário + (salário * 10 / 100) onde [ativo]=1
Suponha que você tenha outra tabela [Address] que armazena a localização dos funcionários e precise atualizar a tabela [Employee] com base nos dados disponíveis na tabela [Address]. Como você atualiza os dados na tabela [Employee]?
Felizmente, existe uma solução – UPDATE da instrução SELECT. Na seção a seguir, veremos diferentes maneiras de realizar atualizações usando uma instrução SELECT. Por exemplo, a tabela [Employee] tem valores NULL para colunas – [PostCode] e [City] na captura de tela a seguir. A tabela [Address] tem valores para ambas as colunas [PostCode] e [City].
Método 1:UPDATE de SELECT:método de junção
Esse método usa junções SQL para fazer referência à tabela secundária que contém valores que precisam ser atualizados. Portanto, a tabela de destino é atualizada com os dados das colunas de referência para as condições especificadas.
É bastante simples usar a instrução UPDATE from SELECT nesta instância. Você pode primeiro usar a instrução SELECT para buscar os valores da coluna de referência e da coluna de destino.
SELECT e.City,A.City, e.PostCode,A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Em seguida, você realizará pequenas alterações em sua consulta e preparará uma instrução UPDATE conforme mostrado abaixo.
- Substitua a palavra-chave selecionada por atualização.
- Especifique o nome da tabela ou o nome do alias que precisa ser atualizado.
- Use uma palavra-chave definida e um símbolo de igual (=) entre as colunas de referência e de destino.
UPDATE e set e.City=A.City, e.PostCode=A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Em seguida, execute a instrução UPDATE e verifique se os valores das colunas de origem e destino são os mesmos.
Método 2:UPDATE de SELECT:A instrução MERGE
A instrução MERGE é útil para manipular dados na tabela de destino com base nos dados da tabela de origem para linhas correspondentes e não correspondentes. É um método alternativo para executar o UPDATE a partir da função da instrução SELECT.
No exemplo de instrução MERGE abaixo, as seguintes tarefas são executadas:
- Use uma instrução MERGE para atualizar dados na tabela [Employee].
- Em seguida, ele faz referência a outra tabela quando a cláusula USING é aplicada.
- O WHEN MATCHED especifica o merge JOIN (Inner Join) entre a tabela de origem e de destino.
- Em seguida, ele atualiza [PostCode] e [City] da tabela [Address] para a tabela [Employee] usando a instrução THEN UPDATE seguida por mapeamentos de coluna de origem e destino.
- A instrução MERGE sempre termina com um ponto e vírgula(;).
MERGE Employee AS e USING(SELECT * FROM [Address]) AS A ON A.EmpID=e.EmpID WHEN MATCHED THEN UPDATE SET e.PostCode=A.PostCode , e.City = A.City;
Método 3:UPDATE de SELECT:método de subconsulta
A subconsulta define uma consulta interna que pode ser usada dentro de uma instrução SELECT, INSERT, UPDATE e DELETE. É um método direto para atualizar os dados da tabela existente de outras tabelas.
UPDATE Employee SET Employee.City=(SELECT [Address].city FROM [Address] WHERE [Address].EmpID = Employee.EmpId)
- A consulta acima usa uma instrução SELECT na cláusula SET da instrução UPDATE.
- Se a subconsulta encontrar uma linha correspondente, a consulta de atualização atualizará os registros do funcionário específico.
- Se a subconsulta retornar NULL (sem linha correspondente), ela atualizará NULL para a respectiva coluna.
- Se a subconsulta retornar mais de uma linha correspondente, a instrução UPDATE gerará um erro – “A Subconsulta do SQL Server retornou mais de 1 valor. Isso não é permitido quando a subconsulta usa operadores de comparação (=, !=, <, <=,>,>=).”
Limitações de subconsultas
- A subconsulta com um operador de comparação pode incluir apenas um nome de coluna, exceto se for usada para o operador IN ou EXISTS. Portanto, se precisarmos atualizar várias colunas de dados, precisamos de instruções SQL separadas.
- Você não pode usar ntext , texto e imagem tipos de dados na subconsulta.
- A subconsulta não pode incluir GROUP BY e a cláusula HAVING se a subconsulta contiver um operador de comparação não modificado. O operador de comparação não modificado não pode usar a palavra-chave ANY ou ALL.
Comparação de desempenho entre diferentes instruções UPDATE de SELECT
Nesta seção, faremos a comparação de desempenho entre diferentes métodos UPDATE de SELECT. Para fazer isso, começaremos executando as consultas SQL juntas, ativando o plano de execução real (Ctrl + M) no SQL Server Management Studio e separando-os usando a instrução Go.
Nos planos de execução, recebo os seguintes dados para minha demonstração:
- O método de junção tem um custo de consulta de 41% (em relação ao lote geral)
- A instrução MERGE tem um custo de consulta de 34% (em relação ao lote geral)
- O método de subconsulta tem um custo de consulta de 24% (em relação ao lote geral)
O método JOIN usa 40% de custo para a classificação distinta e 35% de custo para atualização de índice clusterizado.
A junção de mesclagem usa uma junção interna para correspondência de linhas de dados entre os dados de origem e de destino. Ele também tem o custo relativo máximo para o operador de classificação.
A subconsulta é o método mais rápido para atualizar os dados da coluna. Ele usa a atualização do índice clusterizado e a verificação do índice clusterizado conforme destacado.
Para obter mais detalhes, você pode consultar meus artigos anteriores: Plano de execução do SQL Server — O que é e como ele ajuda com problemas de desempenho? e Como ler e analisar os planos de execução do SQL Server.
Resumo
Você pode usar qualquer método especificado neste artigo para executar UPDATE de instruções SELECT. A subconsulta funciona de forma eficiente, mas tem suas próprias limitações, conforme destacado anteriormente. O desempenho geral do banco de dados depende dos dados da tabela, do número de atualizações, das relações das tabelas, dos índices e das estatísticas.