INNER JOIN

RIBEIROSA 17/12/2012 11:19:00
#416062
Bom dia a todos,

Tenho três tabelas (NFe, contratos e despesas).
Preciso fazer uma consulta onde obtenha os dados por [Ô]contrato[Ô] das tabelas [Ô]despesas[Ô] e [Ô]NFe[Ô],
O campo codigo_contrato existe nas três tabelas.
Escrevi o seguinte código, que não da erro mas também não funcioina.
O BD é Access.
Se alguém puder ajudar,

Wagner



gstSQL_Final = [Ô][Ô]
gstSQL_Final = [Ô]SELECT ctt.Titulo, nfe.Numero_NFE, nfe.numero_nfe_substituida, nfe.cidade_serviço, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.dia_emissao_NFe, nfe.mes_emissao_NFe, nfe.ano_emissao_NFe, nfe.codigo_contrato, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.dia_recebimento_1_NFe, nfe.mes_recebimento_1_NFe, nfe.ano_recebimento_1_NFe, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.dia_recebimento_2_NFe, nfe.mes_recebimento_2_NFe, nfe.ano_recebimento_2_NFe, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.valor_serviço_bruto, nfe.valor_serviço_liquido_1, nfe.valor_serviço_liquido_2, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] ctf.valor_real, ctf.mes_pagamento, ctf.ano_pagamento, ctf.codigo_contrato[Ô]

gstSQL_Final = gstSQL_Final & [Ô] FROM ((custo_total_df as ctf [Ô]

gstSQL_Final = gstSQL_Final & [Ô] inner join NFe as nfe on ctf.codigo_contrato = nfe.codigo_contrato)[Ô]

gstSQL_Final = gstSQL_Final & [Ô] inner join contratos as ctt on ctt.codigo_contrato = ctf.codigo_contrato) [Ô]

gstSQL_Final = gstSQL_Final & [Ô] where [Ô] & gstSQL_Where

gstSQL_Final = gstSQL_Final & [Ô] order by [Ô] & gstSQL_order

MsgBox [Ô]string : [Ô] & gstSQL_Final
ALVAROVB2009 17/12/2012 11:41:12
#416063
Ribeirosa o problema pode estar no inner join, pois o comando inner join o registro existir nas tabelas de comparação para poder trazer o resultado, caso em uma das tabelas não tenha, ele tras em branco mesmo. O que vc pode fazer é o seguinte, usar o left join no lugar do inner join. Acho que com isso irá resilver o seu problema e os parentes não precisa colocar 2, apenas 1 é o suficiente , ficaria algo assim a sua busca nas tabelas

FROM (custo_total_df as ctf
left join NFe as nfe on ctf.codigo_contrato = nfe.codigo_contrato)
left join contratos as ctt on ctt.codigo_contrato = ctf.codigo_contrato
RIBEIROSA 17/12/2012 12:33:41
#416069
Alvarovb2009,

Valeu a atenção !

Vou te dar mais detalhes do sistema e o que esta ocorrendo.

NFe : tabela de notas fiscais emitidas (faturamento),

CTF : tabela de pagamentos feitos por contratos (despesas),

CTT : tabela de contratos

Preciso de uma query que me de os pagamentos feitos por contrato(s), e as notas emitidas pelo(s) mesmo(s) contrato(s) no período selecionado (mês/ano).

Um contrato pode ter (ou não) vários pagamentos e varias notas emitidas no período selecionado.

Na minha query esta acontecendo o seguinte.

Ao encontrar a primeira ocorrência de uma [Ô]nota fiscal[Ô] no período selecionado, gera um relatório de mais de duas mil linhas com o mesmo conjunto de dados,
com o [Ô]left join[Ô] também !

Espero que não tenha complicado muito.

Wagner


ALVAROVB2009 17/12/2012 13:01:06
#416072
certo, faça o seguinte coloque o comando distinct na frente do código da tabela do faturamento, ficaria assim
select distinct(nfe.codigo_contrato) ........

Acho que isso pode ajudar você, pois ja aconteceu comigo e eu verifiquei que existiam muitas linham duplicadas com os mesmos dados, esse comando evita essa duplicidade
RIBEIROSA 17/12/2012 15:59:41
#416085
Estou avaliando e testando sua nova sugestão !
MARCELO.TREZE 18/12/2012 12:46:13
#416145
enta assim

gstSQL_Final = [Ô][Ô]
gstSQL_Final = [Ô]SELECT ctt.Titulo, nfe.Numero_NFE, nfe.numero_nfe_substituida, nfe.cidade_serviço, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.dia_emissao_NFe, nfe.mes_emissao_NFe, nfe.ano_emissao_NFe, nfe.codigo_contrato, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.dia_recebimento_1_NFe, nfe.mes_recebimento_1_NFe, nfe.ano_recebimento_1_NFe, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.dia_recebimento_2_NFe, nfe.mes_recebimento_2_NFe, nfe.ano_recebimento_2_NFe, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] nfe.valor_serviço_bruto, nfe.valor_serviço_liquido_1, nfe.valor_serviço_liquido_2, [Ô]

gstSQL_Final = gstSQL_Final & [Ô] ctf.valor_real, ctf.mes_pagamento, ctf.ano_pagamento, ctf.codigo_contrato[Ô]

gstSQL_Final = gstSQL_Final & [Ô] FROM (custo_total_df as ctf INNER JOIN (Nfe INNER JOIN contratos as ctt ON ctt.codigo_contrato = ctf.codigo_contrato)[Ô]

gstSQL_Final = gstSQL_Final & [Ô] ON ctf.codigo_contrato = nfe.codigo_contrato)[Ô]

gstSQL_Final = gstSQL_Final & [Ô] where [Ô] & gstSQL_Where

gstSQL_Final = gstSQL_Final & [Ô] order by [Ô] & gstSQL_order

MsgBox [Ô]string : [Ô] & gstSQL_Final
RIBEIROSA 20/12/2012 10:01:53
#416232
Só poderei voltar aos testes após o natal !

Estamos fechando o ano !

Feliz Natal a todos !
Faça seu login para responder