Uma das perguntas que eu mais recebo é sobre como fazer um UPDATE/ DELETE em uma tabela, usando como condição colunas de outra tabela, ou seja, com um JOIN. E por isso resolvi escrever este post.
Para relembrar:
WHERE
A minha primeira declaração é simples e direta! WHERE é VIDA!!!
Ele salva a sua e a do DBA!
Juro para você que não é exagero! Principalmente quando estamos alterando dados, porque dados incorretos podem ser mais perigosos do que dados perdidos. E ambos podem custar o seu emprego!
Na clausula WHERE você deve informar as condições de exclusão/ alteração dos dados. Então a minha primeira dica, é que você escreva primeiro esta clausula e depois o restante do comando. A probabilidade de você precisar modificar/ deletar todas as linhas de uma tabela, é baixa.
UPDATE
O comando UPDATE atualiza o valor de uma ou várias colunas de uma tabela.
Não custa lembrar… CUIDADO!!! Se a cláusula WHERE não for usada, todas as linhas da tabela serão atualizadas. Do contrário, quando a clausula WHERE é informada, somente as linhas que obedecem a condição são atualizadas.
UPDATE nome da tabela SET
NOME DA COLUNA1 = novo valor, NOME DA COLUNA2 = novo valor2
WHERE condição
Podemos traduzir o comando como… Atualize na tabela XXX a coluna z1 para o valor abc1, a coluna z2 para o valor abc2 em todas as linhas que obedeçam a condição yyy
Pontos importantes
Primeiro Ponto – Entenda o problema
Sempre que você precisa fazer uma operação de alteração ou exclusão de dados, procure entender a solicitação, nem sempre é fácil e nem sempre é trivial. Lembre-se que os dados são um dos principais patrimônios das organizações, então invista um tempo entendendo o problema.
Segundo Ponto – Entenda o modelo de dados
Vamos evitar o sofrimento? Entenda o seu modelo de dados, se você entender como as informações estão relacionadas vai ser muito mais fácil fazer o JOIN.
Terceiro Ponto – Escreva um comando SELECT
Antes de fazer a alteração nos dados, selecione-os! Veja se o retorno do comando SELECT é o esperado.
Quarto Ponto – Leia alguns posts bacanas no blog
Post lindo e importante sobre JOINS
Vamos para um cenário de exemplo
Imagine que temos um banco de dados de um grande e-commerce, e precisamos dar um desconto de 1,00 no preço de todos os produtos que tiveram uma quantidade vendida maior que 30 itens.
O diagrama das tabelas envolvidas neste processo está na figura 1.
Perceba que vamos atualizar a coluna Preco da tabela Produto, mas nesta tabela não há informações de pedido. Precisamos de um JOIN entre a tabela de Produto e a tabela de Pedido. Porém para complicar um pouco, estas tabelas são relacionadas através da tabela de ItemPedido.
(Veja como é muito mais fácil entender o que deve ser feito se você tiver um diagrama.)
Problema entendido, hora de escrever um comando SELECT, com a coluna que será atualizada e as condições impostas pela situação de negócio, atenção que o comando está com vários comentários (todas as linhas com — significam comentários):
--Coluna Preco é a coluna que será atualizada. Precisamos tirar 1,00 do preço de cada produto SELECT (Preco -1) FROM --Fazer o JOIN entre a tabela de `roduto e ItemPedido Produto INNER JOIN ItemPedido ON --O JOIN será feito pelas colunas que relacionam as tabelas. --Neste caso a PK da tabela Produto é uma FK na tabela de ItemPedido, e serão usados no JOIN Produto.ProdutoID = ItemPedido.ProdutoID --Fazer o JOIN entre a tabela de ItemPedido com a tabela Pedido INNER JOIN Pedido ON --Neste caso a PK da tabela Pedido é uma FK na tabela de ItemPedido, e serão usados no JOIN ItemPedido.PedidoID = Pedido.PedidoID --Aplicar os filtros, neste caso atualizar somente os produtos que tiveram uma quantidade maior que 30 WHERE Pedido.ItensPedido > 30
Com o comando SELECT feito e conferido, é hora de fazer o comando UPDATE, e para isso precisamos saber qual a tabela que será atualizada (Produto) e quais as colunas (Preco).
Neste caso teremos uma clausula a mais no comando UPDATE que é a clausula FROM. Veja como nosso comando ficou com os comentários explicando cada etapa:
--Tabela que será atualizada: Produto UPDATE PRODUTO --Coluna Preco é a coluna que será atualizada. Precisamos tirar 1,00 do preço de cada produto SET Produto.Preco = (Produto.Preco -1) --A novidade é a clausula FROM no comando UPDATE FROM --Fazer o JOIN entre a tabela de produto e ItemPedido Produto INNER JOIN ItemPedido ON --O JOIN será feito pelas colunas que relacionam as tabelas. --Neste caso a PK da tabela Produto é uma FK na tabela de ItemPedido, e serão usados no JOIN Produto.ProdutoID = ItemPedido.ProdutoID --Fazer o JOIN entre a tabela de ItemPedido com a tabela Pedido INNER JOIN Pedido ON --Neste caso a PK da tabela Pedido é uma FK na tabela de ItemPedido, e serão usados no JOIN ItemPedido.PedidoID = Pedido.PedidoID --Aplicar os filtros, neste caso atualizar somente os produtos que tiveram uma quantidade maior que 30 WHERE Pedido.ItensPedido > 30
Conclusão
Não é um processo trivial! Eu te entendo! Mas se você seguir os passos que eu descrevi, e ler os posts indicados, tenho certeza que em pouco tempo estará criando comandos fantásticos!
Se você precisasse fazer um DELETE com JOIN seria bem parecido com o UPDATE. Siga a mesma lógica e depois me diz se você conseguiu.
Temos mais alguns pontos para conversar sobre o SQL Server, mas depois o que virá? Ainda não sei… Por isso peço a sua ajuda. Qual BD você gostaria de conhecer e quer que eu aborde aqui no blog?