INNER JOIN de 4 tabelas

MySQL

18/08/2013

Tenho 4 tabelas contratos, empresa, objeto e debito, quero realizar uma consulta para exbir: contratos,empresa(nome),valor_o(orçado) e valor_r(realizado/pago), na primeira query retorna tudo correto:
SELECT c.contrato,e.empresa,sum(o.valor) as valor_o FROM objeto o INNER JOIN contratos c ON (c.contrato = o.contrato) INNER JOIN empresa e ON (c.empresa = e.id_empresa) group by c.contrato (valor_o correto)

Já na segunda quando incluo a tabela debito d ele retorna contrato, empresa corretos, mas valor_o e valor_r dobrado ou diferente.

SELECT c.contrato,e.empresa,sum(o.valor) as valor_o,sum(d.valor) as valor_r FROM objeto o INNER JOIN contratos c ON (c.contrato = o.contrato) INNER JOIN empresa e ON (c.empresa = e.id_empresa) INNER JOIN debito d ON (o.contrato = d.contrato) group by d.contrato


Gostaria de saber qual o erro e solução.
Claudio Galvao

Claudio Galvao

Curtidas 0

Respostas

William

William

18/08/2013

Colega Claudio, dizem os DBAs mais experientes (não é o meu caso ..rsrsr) que devemos usar no máximo 5 de tabelas no mesmo JOIN, isso em questão de performance e complexidade nas comparações que são executadas todas vez que usamos JOINs. No seu caso são 4 tabelas apenas, mas entre as comparações está ocorrendo duplicidade de registros em algum ponto.

Meu conselho sem conhecer a estrutura do seu banco é, tente trabalhar com LEFT ou RIGHT JOIN ou use um subselect nessa instrução.
GOSTEI 0
Claudio Galvao

Claudio Galvao

18/08/2013

<b>Solução:</b>
SELECT c.contrato,e.empresa,o.objeto, sum(o.valor) as valor_o,(select sum(valor) from debito where contrato = c.contrato) as valor_r FROM contratos c join empresa e on(c.empresa = e.id_empresa) join objeto o on(c.contrato = o.contrato) group by c.contrato
GOSTEI 0
William

William

18/08/2013

Dúvida solucionada, estou encerrando o post!
GOSTEI 0
POSTAR