› Fóruns › SQL e PL/SQL › Consulta Simples duas tabelas › Consulta Simples duas tabelas
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:
- 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.
- 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:
- 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.