Pular para o conteúdo
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #100079
    filipedc
    Participante

      Pessoal,

      Sou novo aqui no forum e estou precisando de uma ajuda pra concluir um update

      UPDATE
      TGFCTE CTE
      SET
      CTE.QTDEST = CTE.QTDEST +
      (SELECT DISTINCT QTDEST
      FROM
      TGFCTE CT
      WHERE
      CT.DTCONTAGEM = CTE.DTCONTAGEM
      AND ((CT.CODLOCAL > 1980000
      AND CT.CODLOCAL <= 1990000) OR (CT.CODLOCAL > 6980000 AND CT.CODLOCAL <=6990000)) AND CT.CODPROD = CTE.CODPROD) WHERE CTE.DTCONTAGEM='17/07/2011' Se eu fizer o mesmo update colocando um produto definido ele da certo e atualiza so que eu preciso dar o update na tabela inteira e sem produto o oracle me retorna o erro: a subconsulta de uma unica linha retorna mais de uma linha

      #100080
      leandrolbs
      Participante

        Cara, esse select seu está retornando mais de uma linha…


        select * from TGFCTE CTE
        where exists (
        SELECT * FROM TGFCTE CT
        WHERE CT.DTCONTAGEM = CTE.DTCONTAGEM
        AND ((CT.CODLOCAL > 1980000 AND CT.CODLOCAL 6980000 AND CT.CODLOCAL <=6990000))
        AND CT.CODPROD = CTE.CODPROD)

        Roda este select, veja qtas linhas vai trazer….

        para finalizar isto, uma simples clasula ajudaria… o MAX(), porem dependendo da informação na tabela, o resultado não ficaria o esperado…

        mas tente:

        [...]
        (SELECT max(QTDEST)
        FROM
        TGFCTE CT
        [...]

        #100081
        rman
        Participante

          Verifica se não esta faltando ligação entre as tabelas TGFCTE CTE e TGFCTE CT, é apenas CT.DTCONTAGEM = CTE.DTCONTAGEM e CT.CODPROD = CTE.CODPROD ? Talvez está sendo criado um produto cartesiano…

          #100083
          filipedc
          Participante

            testei com o max e nao deu certo ele zerou o qtdest para aqueles que nao existiam valor nos locais da regra, em questao das ligacoes faz so mais uma que e a do codigo da empresa ct.codemp = cte.codemp

            Me falaram pra fazer com inner join so que nao entendo mto bem a escrita do inner join

            #100084
            rman
            Participante

              Não consegui entender o que você precisa fazer…

              Você está tentando atualizar o campo QTDEST da TGFCTE, utilizando a tabela TGFCTE, ou seja, ela mesma… é isso mesmo ?

              Utilizando a terceira ligação, também da erro ?

              O a sintaxe do inner join é assim


              SELECT *
              FROM PAI P
              INNER JOIN FILHO F ON F.ID_PAI = P.ID_PAI

              isso corresponde a


              SELECT *
              FROM PAI P, FILHO F
              WHERE F.ID_PAI = P.ID_PAI

              #100085
              filipedc
              Participante

                Exato! na tabela tgfcte tenho duas linhas de um mesmo produto que a unica coisa que diferencia eles e o codlocal, preciso somar essas duas linhas criando um qtdest so.

                entendi a nomeclatura do join, entao no caso so teria como usar o join se caso fosse de tabelas diferentes??

                #100087
                rman
                Participante

                  [quote=”filipedc”:245e1uvj]Exato! na tabela tgfcte tenho duas linhas de um mesmo produto que a unica coisa que diferencia eles e o codlocal, preciso somar essas duas linhas criando um qtdest so.

                  entendi a nomeclatura do join, entao no caso so teria como usar o join se caso fosse de tabelas diferentes??[/quote]

                  Verifica se é isso que você quer fazer

                  CODPROD – QTDEST – CODLOCAL
                  10 – 5 – 35
                  10 – 4 – 40

                  Após UPDATE

                  CODPROD – QTDEST – CODLOCAL
                  10 – 9 – 35
                  10 – 9 – 40

                  O produto 10 possui quantidade 5 no local 35 e 4 no local 40, depois do UPDATE o produto 10 possui 9 no local 35 e 9 no local 40, é isso que você quer fazer ?

                  Se for tente:


                  UPDATE
                  TGFCTE CTE
                  SET
                  CTE.QTDEST = CTE.QTDEST +
                  (SELECT SUM(COALESCE(QTDEST,0))
                  FROM
                  TGFCTE CT
                  WHERE
                  CT.DTCONTAGEM = CTE.DTCONTAGEM
                  AND ((CT.CODLOCAL > 1980000
                  AND CT.CODLOCAL 6980000 AND CT.CODLOCAL <=6990000))
                  AND CT.CODPROD = CTE.CODPROD) WHERE CTE.DTCONTAGEM='17/07/2011'

                  O INNER JOIN pode ser usado em auto relacionamento também…

                  #100089
                  filipedc
                  Participante

                    Rman consegui aqui da seguinte maneira executei a linha de comando que voce passou e percebi que para aqueles que nao tinham qtdest em dois locais ele tava zerando o meu qtdest, entao coloquei um nvl na frente do subselect ai resolveu o problema

                    UPDATE
                    TGFCTE CTE
                    SET
                    CTE.QTDEST = CTE.QTDEST +
                    NVL((SELECT SUM(COALESCE(QTDEST,0))
                    FROM
                    TGFCTE CT
                    WHERE
                    CT.DTCONTAGEM = CTE.DTCONTAGEM
                    AND ((CT.CODLOCAL > 1980000
                    AND CT.CODLOCAL 6980000 AND CT.CODLOCAL <=6990000))
                    AND CT.CODPROD = CTE.CODPROD),0) WHERE CTE.DTCONTAGEM='17/07/2011'

                    cara vlw ai!!!

                  Visualizando 8 posts - 1 até 8 (de 8 do total)
                  • Você deve fazer login para responder a este tópico.
                  plugins premium WordPress