Pular para o conteúdo
Visualizando 14 posts - 1 até 14 (de 14 do total)
  • Autor
    Posts
  • #94022
    MARCIO_LOK
    Participante

      Boa noite pessoal

      Preciso mais uma vez da ajuda de vcs…
      eu possuo duas tabelas…

      uma tem dois campos…
      codigo descricao
      1 Ativo
      12 Caixa
      123 Banco
      1234 Diversos
      12345 Outros

      na outra tabela tenho o campo codigo e valor.
      codigo e valor
      123 R$ 345,77
      12345 R$ 60.00

      Eu queria que ficasse asssim:
      codigo descricao valor
      1 Ativo
      12 Caixa
      123 Banco R$ 345,77
      1234 Diversos
      12345 Outros R$ 60,00

      Ou seja, queria concatenar as duas tabelas, as que tivessem o campo codigo

      correspondente puxava o valor na frente o que nao tivesse exibiria o valor da primeira

      tabela como faco isso?
      Obrigado

      Marcio

      #94024
      marlontk
      Participante

        Neste tipo de caso voce pode utilizar (+) ao lado da junção que pode não conter os dados que indica ao banco que se ele nao encontrar o codigo correspondente na tabela b ele vai mostrar igualmente os campos da tablela a.

        select a.codigo,a.descricao,b.valor
        from tabela1 a, tabela2 b
        where a.codigo = b.codigo(+);

        Atenciosamente

        Marlon

        #94026
        MARCIO_LOK
        Participante

          Marlon

          Nao deu certo nao, a unica diferenca é que usei com Join ….

          From Clanca L Join Cconta C
          On L.Codcoligada = C.Codcoligada
          And L.Credito = C.Codconta
          Or L.Debito = C.Codconta
          Join Ccontahistorico H
          On H.Codcoligada = C.Codcoligada
          and H.CodConta(+) = C.CodConta
          Join Csdant S
          On S.Codcoligada = C.Codcoligada
          And S.Codconta = C.Codconta

          ele da o seguinte erro:
          ORA-25156: a junção externa de estilo antigo (+) não pode ser usada com junções ANSI
          25156. 00000 – “old style outer join (+) cannot be used with ANSI joins”
          *Cause: When a query block uses ANSI style joins, the old notation
          for specifying outer joins (+) cannot be used.
          *Action: Use ANSI style for specifying outer joins also.
          Erro na linha: 77 Coluna: 13

          #94029
          marlontk
          Participante

            Cara Não uso junção tipo Ansi e neste caso não sei se este recurso funciona teria que ver no documentação.

            #94035
            MARCIO_LOK
            Participante

              Ixi, entao ferrou, porque to usando join, pra agrupar varias tabelas…

              #94038
              burga
              Participante

                Usa left outer join, você está tentando utilizar o join de duas maneiras entre as mesmas tabelas… Ou seja você está tentando o inner join com Cconta e Ccontahistorico mas na cláusula ON está indicando um left outer join (H.CodConta(+) = C.CodConta), nunca vai funcionar…

                tenta desta forma:

                From Clanca L Join Cconta C
                On L.Codcoligada = C.Codcoligada
                And L.Credito = C.Codconta
                Or L.Debito = C.Codconta
                left outer Join Ccontahistorico H
                On H.Codcoligada = C.Codcoligada
                and H.CodConta = C.CodConta
                Join Csdant S
                On S.Codcoligada = C.Codcoligada
                And S.Codconta = C.Codconta

                ou


                From Clanca L Join Cconta C
                On L.Codcoligada = C.Codcoligada
                And L.Credito = C.Codconta
                Or L.Debito = C.Codconta
                Join Csdant S
                On S.Codcoligada = C.Codcoligada
                And S.Codconta = C.Codconta,
                Ccontahistorico H
                where
                H.Codcoligada = C.Codcoligada
                and H.CodConta(+) = C.CodConta

                #94040
                MARCIO_LOK
                Participante

                  nao deu certo…

                  no primeiro ele nao mostra…. ele continua como se nao tivesse usando o left outer join… e no segundo exemplo… apresenta esse erro aqui oh..

                  ORA-25156: a junção externa de estilo antigo (+) não pode ser usada com junções ANSI
                  25156. 00000 – “old style outer join (+) cannot be used with ANSI joins”
                  *Cause: When a query block uses ANSI style joins, the old notation
                  for specifying outer joins (+) cannot be used.
                  *Action: Use ANSI style for specifying outer joins also.
                  Erro na linha: 85 Coluna: 24

                  #94041
                  burga
                  Participante

                    No segundo seria o seguinte:

                    From Clanca,Cconta C,Csdant S,
                    Ccontahistorico H
                    where
                    H.Codcoligada = C.Codcoligada
                    and H.CodConta(+) = C.CodConta
                    and L.Codcoligada = C.Codcoligada
                    and (L.Credito = C.Codconta
                    Or L.Debito = C.Codconta)
                    and S.Codcoligada = C.Codcoligada
                    and S.Codconta = C.Codconta

                    outra coisa que eu mudei foi L.Codcoligada = C.Codcoligada And L.Credito = C.Codconta Or L.Debito = C.Codconta

                    colocando o OR entre (). Se eu estiver errado na lógica você tira os () do OR.

                    #94043
                    MARCIO_LOK
                    Participante

                      ainda da dando erro, olha só como ficou:

                      From Clanca,Cconta C,Csdant S,
                      Ccontahistorico H
                      Where
                      H.Codcoligada = C.Codcoligada
                      And H.Codconta(+) = C.Codconta
                      And L.Codcoligada = C.Codcoligada
                      And (L.Credito = C.Codconta
                      Or L.Debito = C.Codconta)
                      And S.Codcoligada = C.Codcoligada
                      And S.Codconta = C.Codconta
                      And Substr(C.Codconta,1,1) = ‘1’
                      And To_Char(L.Data,’yy’) = ’09’
                      GROUP BY H.Descricao, H.CodConta

                      ta certo? Esse codigo da erro…

                      ORA-00904: “L”.”DEBITO”: identificador inválido
                      00904. 00000 – “%s: invalid identifier”
                      *Cause:
                      *Action:

                      #94044
                      MARCIO_LOK
                      Participante

                        Amigao….. esse problema ja achei, é que a tabela clanca ta sem um apelido… colquei a letra L e rodou… só que nao puxa os codigos que nao tem associacao nao….
                        só tras os que tem mesmo….
                        😥

                        #94045
                        burga
                        Participante

                          Você diz os codigos que nao tem associação na tabela de historico certo?

                          Se existir o codigo na tabela corrente e na tabela de historico e ainda assim ele não tiver retornando, vc pode dar uma revisada nos outros joins porque são eles que estão filtrando… Da uma revisada neles que vc encontra quem está filtrando…

                          #94046
                          MARCIO_LOK
                          Participante

                            Revisei, e os joins estao ligados corretamentes… nao sei porqie ele nao me tras os codigos da tabela historico (historicos) q nao tem nada com a tabela lancamentos (clanca), as ligacoes estao corretas…. tras tudo certinho… mais o que eu quero, ou seja, todos os codigos da tabela historico…

                            #94058
                            burga
                            Participante

                              Vamos analisar tudo o que você falou e mais o seu código:

                              From Clanca L,Cconta C,Csdant S,
                              Ccontahistorico H
                              Where
                              H.Codcoligada = C.Codcoligada
                              And H.Codconta(+) = C.Codconta
                              And L.Codcoligada = C.Codcoligada
                              And (L.Credito = C.Codconta
                              Or L.Debito = C.Codconta)
                              And S.Codcoligada = C.Codcoligada
                              And S.Codconta = C.Codconta
                              And Substr(C.Codconta,1,1) = '1'
                              And To_Char(L.Data,'yy') = '09'
                              GROUP BY H.Descricao, H.CodConta

                              Segue os passos do que está acontecendo na sua consulta, veja se está correto a lógica da sua consulta:

                              1. Você faz um INNER JOIN entre as tabelas Clanca e Cconta onde:

                              – 1.1. Clanca.Credito ou Clanca.Debito é igual a Cconta.Codconta.
                              – 1.2. Além de Clanca.Credito ou Clanca.Debito ser igual a Cconta.Codconta também Clanca.Codcoligada deve ser igual a Cconta.Codcoligada.
                              – 1.3. Além de tudo, a consulta só retornará os resultados onde o primeiro caractere de Cconta.Codconta é igual a ‘1’ E o ano de Clanca.Data deve ter final 09.

                              1. Você faz um INNER JOIN do resultado do processamento anterior com a tabela Csdant, onde:

                              – 2.1. Csdant.Codcoligada é igual a Cconta.Codcoligada E Csdant.Codconta é igual a Cconta.Codconta.

                              Considerando que você utilizou a seguinte cláusula:
                              GROUP BY H.Descricao, H.CodConta

                              O que significa que sua cláusula Select retorna somente os campos H.Descricao e H.CodConta então temos:

                              SE depois de todos os filtros dos processamentos 1 e 2 a consulta retornar somente códigos Cconta.Codconta que não possuam correspondentes na tabela de histórico, então não deve aparecer nada em seu resultado.

                              Caso contrário, o left outer join fará diferença no resultado, seguindo o processamento 3:

                              1. left outer join do resultado do processamento 2 com a tabela Ccontahistorico, onde:

                              – 3.1. Se existir Ccontahistorico.Codconta igual a Cconta.Codconta, fazer o join e trazer os resultados, senão trazer somente os resultados do processamento 2 e campos nulos em Ccontahistorico.

                              O que podemos concluir disso tudo é que, se os joins não estão filtrando os resultados que você quer, então as condições Substr(C.Codconta,1,1) = ‘1’ e To_Char(L.Data,’yy’) = ’09’ estão fazendo este papel. Se as condições também não estão fazendo isto, então é problema na lógica da sua consulta e você terá que defini-la melhor e reescrevê-la OU ainda pode ser problema nos seus dados.

                              Verifique os processamentos 1, 2 e 3 que eu postei aqui e veja se a sua consulta está realmente correta, atentando aos INNER JOINS pois quando não existir correspondente em uma das três tabelas envolvidas nos INNER JOINS o registro será excuído do resultado. Testando a consulta por partes facilita encontrar onde está o problema.

                              #94075
                              MARCIO_LOK
                              Participante

                                Amigao Valeu, nao consegui mesmo, infelizmente me falta competencia pra achar esse problema. acho que vou transformar em duas views e linkar ambas….. infelizmente nao consegui mesmo, analisei e nada… brigadao pela forca… abracos

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