Jump to content
Julio Albuquerque

Update com subquery , porém a subquery precisa acessar uma linha/coluna da tabela que está sofrendo update!

Recommended Posts

Olá!

Preciso resolver um script MySql onde preciso efetuar cálculos como se fosse uma conta corrente, onde cada DIA tem um saldo anterior, total de entradas, total de saída e saldo atual do dia.

Porém o próximo dia deverá ter como saldo anterior o saldo atual do dia anterior,ok?

Bom, fiz um script que praticamente funcionou, porém em  uma subquery preciso passar o valor da linha da tabela que está sendo atualizada, mas isso não está sendo possível.

Gostaria de ajuda, caso alguém tenha feito algo semelhante. Abaixo o script:

update gestao_centro_financeiro_diario g1
set g1.vlsaldo_inicial = (case
                                when idcentrofinanceirodiario = (select *
                                                                 from (select min(g2.idcentrofinanceirodiario)
                                                                       from gestao_centro_financeiro_diario g2
                                                                       where g2.idcentrofinanceiro = 1) as inicial)
                                    then g1.vlsaldo_inicial
                                else (select *
                                      from (select g3.saldo_atual
                                            from gestao_centro_financeiro_diario g3
                                            where g3.idcentrofinanceirodiario = (select *
                                                                              from (select max(g4.idcentrofinanceirodiario)
                                                                                    from gestao_centro_financeiro_diario g4
                                                                                    where g4.idcentrofinanceirodiario <
                                                                                          g1.idcentrofinanceirodiario) as id)) as saldo) end),
    g1.saldo_atual     = g1.vlsaldo_inicial + g1.total_entrada - g1.total_saida
where g1.idcentrofinanceiro = 1
    order by g1.data

Meu problema está justamente quando no final do script, onde tem uma cláusula WHERE: ...where g4.idcentrofinanceirodiario < g1.idcentrofinanceirodiario) as id))...

Onde a tabela g1 é a tabela que está sofrendo o UPDATE.

Alguém pode ajudar como resolver? Desta ou de outra forma.

Share this post


Link to post
Share on other sites

Creio que isto será melhor resolvido com um cursor , tente tormar seu sql melhor legível todavia
.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By danicarla
      Oi gente.. tenho uma tabela de endereços e uso php para fazer dois loops para exibir as cidades e depois os bairros daquela cidade,
      fica algo + ou - assim:
      $a = mysql_query('SELECT nome_cidade FROM tab GROUP BY nome_cidade'); while($b = mysql_fetch_array($b)){ echo $b['nome_cidade'].'<br>'; $c = mysql_query('SELECT nome_bairro FROM tab WHERE nome_cidade='$b[nome_cidade]' GROUP BY nome_bairro'); while($d = mysql_fetch_array($c)){ echo $d['nome_bairro'].'<br>'; } } Alguém sabe se eu consigo fazer isso somente com uma consulta? pra não precisar incluir um loop dentro do outro
    • By Kennyguedes
      Olá, preciso transformar a seguinte subquery para utilizar como uma table no join
       
      NVL((SELECT X.MPE_META
          FROM (SELECT MPE_IDC_ID, MPE_META
                FROM META_PERSONALIZADA_SLA M
               ORDER BY M.MPE_META DESC) X
          WHERE ROWNUM = 1
          AND X.MPE_IDC_ID = IDC_ID
          AND X.MPE_META <= APR_NEGOCIACAO_SLA), IDC_META)
       
      eu utilizo esse trecho em vários lugares dentro da minha procedure, então queria utilizar como "LEFT JOIN", assim o custo seria menor da procedure
      caso seja possivel e alguem puder ajuda
    • By TFernandes89
      Bom dia, preciso atualizar uma linha do meu banco de dados validando duas colunas diferentes... estou tentando da seguinte forma:
       
      update produn set prun_margem=prun_margem + 1 from produtos where prod_codigo=prun_prod_codigo and prun_unid_codigo='003' and prun_unid_codigo='050' and prod_grup_codigo='10003'  
      Tenho que atualizar a margem em +1 somente quando se tratar do grupo (prod_grup_codigo) 10003 e nas unidades (prun_unid_codigo) 003 e 050, dessa forma que estou tentando não me da erro, porem não atualiza nada, e se eu tiro a unidade 050 ele atualiza na unidade 003 normalmente.
    • By Oliver_CNP
      Bom dia, 
      Estou apanhando desde ontem em uma sentença Quando eu faço o select fora da sentença sozinho, os dados são demonstrados corretamente, porém, na subquery me ocorre esse erro:
      Multiple columns are specified in an aggregated expression containing an outer reference. If an expression being aggregated contains an outer reference, then outer reference must be the only column referenced in the expression.
      Gostaria de uma ajuda por gentileza, não tenho mais o que fazer. Sublinhei onde ocorre o erro.
      Segue o Select:
      SELECT DISTINCT FUN.IDFUNCIONARIO, FER.CHAPA, FER.INICIOPERAQUIS, FER.FIMPERAQUIS, CASE WHEN FU.CODSITUACAO IN ('A', 'E') AND FER.PERIODOABERTO = 1 THEN (DATEDIFF(DAY, FER.INICIOPERAQUIS,GETDATE())/12) - (SELECT SUM(CASE WHEN PPP.NRODIASFERIAS IS NOT NULL AND FER.PERIODOABERTO = 1 THEN PPP.NRODIASFERIAS ELSE 0 END) FROM PFUFERIASPER PPP WHERE FER.CODCOLIGADA = PPP.CODCOLIGADA AND FER.CHAPA = PPP.CHAPA AND PPP.FIMPERAQUIS = FER.FIMPERAQUIS GROUP BY PPP.CHAPA) WHEN FU.CODSITUACAO IN ('C', 'D') THEN 0 ELSE FER.SALDO END VL_SALDO_FERIAS, FROM PFUFERIAS FER LEFT OUTER JOIN FOL_FUNCIONARIOS FUN ON FUN.CHAPA = FER.CHAPA LEFT OUTER JOIN PFUFERIASPER PER ON PER.CODCOLIGADA = FER CODCOLIGADA AND PER.CHAPA = FER.CHAPA AND PER.FIMPERAQUIS = FER.FIMPERAQUIS LEFT OUTER JOIN PFUNC FU ON FU.CODCOLIGADA = FER.CODCOLIGADA AND FU.CHAPA = FER.CHAPA  
    • By ayrtonmaia25
      Pessoal, tô com uma big dúvida e tô perdido, sem saber o que fazer. Me iniciei no PHP há uns 10/15 anos atrás e pelo menos os últimos 5, passei sem trabalhar com desenvolvimento e não me atualizei com a nova versão do PHP e agora tô enfrentando algumas dificuldades, enfim... Preciso fazer um update de várias linhas no banco de dados. Os dados vem de uma lista de forms com uma paginação e preciso que o update atualize os dados das 10 linhas que são listadas por vez. Segue o código da página, dá pra vocês terem uma noção melhor
      <?php $pagina = (isset($_GET['pagina']))? $_GET['pagina'] : 1; //seleciona todos os itens da tabela $cmd = $conn->query("select prod_id from produtos"); $produtos = $cmd->fetch(); //seta a quantidade de itens por página $registros = 10; //variavel para calcular o início da visualização com base na página atual $inicio = ($registros*$pagina)-$registros; // Variáveis para cor da linha $contacor = 0; $cor1 = ""; $cor2 = "#E0E0E0"; echo "<form class=\"form-group\" method=\"post\" action=\"?pagina=".$pagina."&act=up\">"; //seleciona os itens por página $data = $conn->query('SELECT * FROM produtos ORDER BY prod_id LIMIT '.$inicio.','.$registros.''); while($row = $data->fetch()) { $contacor++; // Se o contador for par if($contacor % 2 == 0){ $color = $cor1; } else { $color = $cor2; } ?> <div class="row mb-3" style="background:<?php echo $color; ?>;"> <div class="col-md-3 p-3 text-center"> <img src="images/produtos/<?php echo $row['prod_img']; ?>" class="img-fluid" style="max-height:200px;"> </div> <div class="col-md-9 p-3"> <p class="lead"> <b class="text-primary">ID do produto: <?php echo $row['prod_id']; ?></b> </p> <p class="lead"> <input type="text" class="form-control" id="form44" placeholder="Título para o produto" name="nome[<?php echo $row['prod_id']; ?>]" value="<?php echo $row['prod_title']; ?>"> </p> <p class="form-check text-primary"> <input type="checkbox" class="form-check-input" name="destaque" id="destaque[<?php echo $row['prod_id']; ?>]"<?php if($row['prod_high']=="yes"){echo " checked"; } ?>> <label class="form-check-label" for="exampleCheck1"><b>Produto em destaque</b></label> </p> </div> </div> <?php } ?>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.