Friday, January 14, 2022

Gambiarra mágica usando queries em sql pra gerar mais queries em sql

 Eu aprendi isso uns anos atrás quando trabalhava migrando dados do banco dos concorrentes pro da empresa onde eu trabalhava e me salvou de ter que dar infinitos ctrl v

Basicamente você faz uma query pegando os valores que precisa de uma tabela e manda a view resultante mostrar eles concatenados dentro de uma string que inclui o comando de uma query que você vai usar pra inserir/atualizar/deletar os dados depois

Por exemplo, você tem uma tabela com milhares de produtos e suas respectivas categorias, e quer popular uma segunda tabela chamada categorias com a lista de categorias, rodando:

select concat ('insert into categorias(descricao) values (', categoria, ');') from produtos group by categoria

Você recebe como resultado uma série de comandos:

insert into categorias(descricao) values (fruta); 

insert into categorias(descricao) values (verdura); 

insert into categorias(descricao) values (legume);

  etc

 Aí é só rodar a lista inteira de uma vez e a nova tabela categorias é populada com todos os valores da coluna da tabela produtos, só que sem duplicados.

 

Ou num exemplo onde a própria tabela de onde os dados coletados é atualizada, podemos pegar uma lista com todos os códigos internos e todos os códigos de barras e usando o concat inserimos os dois numa query que manda inverter eles, gerando uma lista de queries com uma quantidade igual à quantidade de itens trazida pelo select:

select concat("update produto set identificacao_interna='",codigo_barra,"', codigo_barra='", identificacao_interna,"' where codigo_barra='", codigo_barra,"' and id_cadastro=123;") from produto

Isso gera uma longa lista de linhas parecidas com a abaixo, mudando só os códigos a cada linha:

update produto set identificacao_interna= '111111111' , codigo_barra= '22222222' where codigo_barra='111111111' and id_cadastro=123;

Aí é só pegar a lista inteira e rodar de uma vez, atualizando ambos os valores em todas as as linhas.

No comments:

Post a Comment