Preciso de uma ajuda pra montar uma instrução update meio diferente.
Tenho uma tabela em que tem vários campos, entre eles: loja, quantidade, valor, rankingqtd e rankingvalor.
Todos os campos estão preenchidos, exceto rankingqtd e rankintvalor.
Preciso de um update justamente pra preenchê-los.
Eu atualmente preencho esses campos via codificação java, mas está lento demais e preciso de uma instrução update que faça isso pra mim, bem mais rápido. Pra entenderem como preencho, em java faço da seguinte forma:
seleciono os dados ordenados por loja (crescente) e quantidade (decrescente)
percorro preenchendo o campo rankingqtd a partir de 1 (incrementando 1 a cada registro)
qdo muda a loja, eu recomeco a numeração a partir do 1
Feito isso pra quantidade eu faço a mesma coisa pra preencher o ranking de valor.
Isso é muito lento!
Por favor, alguém me ajuda a montar um update pra fazer isso? Não tem problema se eu tiver que fazer um pra cada loja… se não tiver jeito eu faço uma loja de cada vez.
Eu preciso no momento pra MySQL, depois terei que fazer pra SQLServer e Oracle tb, mas por hora se eu conseguir fazer em MySQL depois eu traduzo pros outros BDs.
Renata,
Você pode usar HQL ou deve se SQL ‘puro’? Eu não sei como resolver isso ainda, mas vamos discutir o que você pode tentar fazer.
Outra pergunta, nessa ‘passada’ que você faz pelos registros, o valor de rankingqtd e rankingvalor são iguais para todos (digamos, rankingqtd e rankingvalor são diferentes entre si, mas são iguais entre os registros)?
[quote=Andre Brito]Renata,
Você pode usar HQL ou deve se SQL ‘puro’? Eu não sei como resolver isso ainda, mas vamos discutir o que você pode tentar fazer.
Outra pergunta, nessa ‘passada’ que você faz pelos registros, o valor de rankingqtd e rankingvalor são iguais para todos (digamos, rankingqtd e rankingvalor são diferentes entre si, mas são iguais entre os registros)?[/quote]
Só SQL (como eu falei, pros 3 bancos: mysql, oracle e sqlserver)
rankingqtd e rankingvalor são sempre diferentes, entre si e entre os registros.
Pelo visto você vai atualizar quase todos (se não todos) os registros da tabela. Neste caso os utilitários costumam ser mais rápidos do que programas com SQL. Você pode montar um arquivo texto com os dados que você quer carregar/atualizar e depois usar como entrada para o utilitário. Todo banco de dados tem seu utilitário próprio. A sintaxe varia um pouco mas a filosofia é a mesma. Veja para mySQL: http://dev.mysql.com/doc/refman/5.1/en/load-data.html
Isso tem mais cara de trabalho para Stored Procedure, não? Acho difícil conseguir essa iteração através de comando SQL.
Só de curiosidade: essa atualização em massa é feita rotineiramente no seu sistema? É “online”, comandada pelo usuário, ou é uma tarefa com execução agendada?
Atualizacao agendada, roda diariamente, de madrugada pra não afetar.
Consegui fazer pra MySQL. Eu tô sem tempo pra nada aqui, joguei tudo pro alto e briquei com o SQL até que montei. Agora preciso parar alguma coisa pra poder fazer o msm pra Oracle e SQLServer.
Pra quem ficou curioso, pra MySQL ficou assim:
update estcurva c
inner join (select x.cdprod, @id := @id+1 as id
from estcurva x, (select @id := 0) id
where x.loja = 1
and x.mes = 8
and x.ano = 2009
order by x.quantidade desc) r on r.cdprod = c.cdprod
set c.rankingqtd = r.id
where c.loja = 1
and c.mes = 8
and c.ano = 2009
E respondendo aos amigos, eu tentei por store procedure, mas ficou mais lento, então abandonei.
Depois tento fazer pros demais BDs.