Eu tenho uma tabela com a estrutura abaixo:
create table Z_TEST_ONE
(
col_id NUMBER,
bed_amnt NUMBER,
bes_amnt NUMBER,
bop NUMBER
)
Os dados de exemplo são assim:
col_id bed_amnt bes_amnt bop
---------- ----------- ---------- -------
1 1000 0 20
1 5000 0 7
1 0 3000 10
1 0 6 14
2 1000 0 1
2 2000 0 2
2 0 1000 3
2 0 2000 4
Agora o que eu preciso é o seguinte: Para cada col_id
, a coluna bop para maior bes_amnt
deve ser igual ao bop para maior bed_amnt
. Então, depois de executar a consulta, o resultado deve ficar assim:
col_id bed_amnt bes_amnt bop
---------- ----------- ---------- -------
1 1000 0 20
1 5000 0 7
1 0 3000 7 ---> changed from 10 to 7
1 0 6 14
2 1000 0 1
2 2000 0 2
2 0 1000 3
2 0 2000 2 ---> changed from 4 to 2
Eu escrevi uma consulta para isso, como você pode ver abaixo:
update z_test_one a
set a.bop =
(select t.bop /* bop for highest bed_amnt */
from z_test_one t
where t.bed_amnt = (select max(bed_amnt)
from z_test_one
where col_id = a.col_id
group by col_id))
where a.bes_amnt = (select max(bes_amnt)
from z_test_one
where col_id = a.col_id
group by col_id)
esta consulta funciona bem e me dá o resultado correto, eu queria saber se existem maneiras melhores de escrever a consulta desejada.
desde já, obrigado
Gostaria de saber se encontrar o novo valor pode ser melhor com:
Talvez a cláusula where possa ser melhor com:
Eu os testaria com seus volumes de dados, estatísticas etc. e veria como os planos reais e a execução se comparam.