Pular para o conteúdo

Fóruns SQL e PL/SQL Consulta Simples duas tabelas Consulta Simples duas tabelas

#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.