none
Obter o último registro de uma tabela A e atualizar registro na Tabela B RRS feed

  • Pergunta

  • Olá, pessoal.

       Eu tenho a seguinte cenário:


    Tabela A (chave estrangeira ProdutoId ligado na tabela B)

    Id  ProdutoId  DataMovimento  PrecoCusto

    1        10           2019-01-01            5,00

    2        10           2019-02-15            5,20

    3        40           2018-05-08            2,50

    4        40           2018-06-01            2,55

    Tabela B (Produtos) 

    Id   Nome       UltimoPrecoCusto 

    10  Sapato              1,00

    20  Chinelo              1,50

    30   Camisa             2,00

    40  Tenis                 5,00

    Minha questão é o seguinte, eu preciso atualizar no campo "UltimoPrecoCusto" da tabela B,  baseado no campo "PrecoCusto"  da tabela A,  no último registro de cada produto. 

    Por exemplo:  Para o produto Sapato (Id = 10), eu preciso atualizar o último preço de custo dele em 2019-02-15 que é de R$ 5,20 que está na tabela A.   Desta forma, eu queria criar um script SQL, que fizesse isso para todos o produtos na Tabela B.

    Alguém poderia me dar um ajuda nesta tarefa?

    Abraços

    Hugo

    segunda-feira, 30 de setembro de 2019 13:53

Respostas

Todas as Respostas

  • Hugo, verifique se o seguinte código SQl atende ao que necessita:

    -- código #1
    UPDATE Tabela_B 
      set UltimoPrecoCusto= (SELECT top (1) A.PrecoCusto
                               from Tabela_A as A
                               where A.ProdutoId = Tabela_B.Id
                               order by DataMovimento desc)
    where exists (SELECT * from Tabela_A as A where A.ProdutoId = Tabela_B.Id);
      

     

    Ou ainda

    -- código #2
    with Ultimo as (
    SELECT ProdutoId, PrecoCusto, 
           seq= row_number() over (partition by ProdutoId order by DataMovimento desc)
      from Tabela_A
    )
    UPDATE B
      set UltimoPrecoCusto= A.PrecoCusto
      from Tabela_B as B
           inner join Ultimo as A on A.ProdutoId = B.Id
      where A.seq = 1;
     


    Se a versão do SQL Server for 2012 (ou mais recente), também é possível resolver utilizando a função LAST_VALUE().

       

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Boa tarde, José Diz!

    Muito obrigado pelo seu feedback.

    Logo após o almoço, irei testar suas dicas e lhe darei um retorno ok?!.

    Quanto ao "LAST_VALUE()." hoje mesmo irei migrar para o SQL SERVER 2017. Você acha que estou no caminho certo?

    Forte abraço e fique com Deus.

    Hugo

    segunda-feira, 30 de setembro de 2019 14:41
  • Hugo, verifique se o seguinte código SQl atende ao que necessita:

    -- código #1
    UPDATE Tabela_B 
      set UltimoPrecoCusto= (SELECT top (1) A.PrecoCusto
                               from Tabela_A as A
                               where A.ProdutoId = Tabela_B.Id
                               order by DataMovimento desc)
    where exists (SELECT * from Tabela_A as A where A.ProdutoId = Tabela_B.Id);
      

     

    Ou ainda

    -- código #2
    with Ultimo as (
    SELECT ProdutoId, PrecoCusto, 
           seq= row_number() over (partition by ProdutoId order by DataMovimento desc)
      from Tabela_A
    )
    UPDATE B
      set UltimoPrecoCusto= A.PrecoCusto
      from Tabela_B as B
           inner join Ultimo as A on A.ProdutoId = B.Id
      where A.seq = 1;
     


    Se a versão do SQL Server for 2012 (ou mais recente), também é possível resolver utilizando a função LAST_VALUE().

       

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Boa tarde, José Diz!

    Muito obrigado pelo seu feedback.

    Logo após o almoço, irei testar suas dicas e lhe darei um retorno ok?!.

    Quanto ao "LAST_VALUE()." hoje mesmo irei migrar para o SQL SERVER 2017. Você acha que estou no caminho certo?

    Forte abraço e fique com Deus.

    Hugo

    Professional MVC,

    Lendo o que foi tratado até aqui neste post, eu acredito que sim.

    Veja também se a função First_Value() também não poderá lhe ajudar em algum momento.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 1 de outubro de 2019 12:19
  • Hugo, a respeito da migração para a versão 2017 do SQL Server, para mim não há como opinar sem conhecer o contexto.

    Em termos de programação em T-SQL, quanto mais recente a versão do SQL Server mais recursos de programação estão disponíveis.

    Espero que uma das soluções que propus tenha te atendido.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Bom dia, José!

       Mais uma vez muito obrigado pelo retorno.

       Sim, suas dicas funcionaram pra mim. Valeu demais!

       Com relação ao SQL 2017, no meu caso, ele se encaixaria e eu ficaria atualizado (embora já exista o 2019). Se eu fizer essa instalação, acredito que não terei grandes problemas com meu banco de dados atual. Mas é como você disse, tem que avaliar todo o contexto, dessa forma evitamos "dores de cabeça".

        Forte abraço e fique com Deus.

    Hugo

     

    quarta-feira, 2 de outubro de 2019 13:30
  • José, infelizmente neste instante surgiu a necessidade de atualizar mais dois campos na TABELA B (Produtos).

    Se for possível, vou precisar de mais uma ajuda sua.

    Eu escolhi e estava utilizando a 1ª opção que voce me sugeriu, mas agora com esses dois campos a mais a serem atualizados, que alteração eu deveria fazer para atualiza-los ?

    quarta-feira, 2 de outubro de 2019 14:29
  • Funcionou perfeitamente!!!!!

    Valeu mesmo, José Diz.

    quarta-feira, 2 de outubro de 2019 21:25