Problems with LEFT JOIN

2

I'm breaking my head a few days ago with SQL on something that should be pretty simple, but I can not figure it out.

I want to get all the data in the [NumOrdem] table including those that are not in the [ItemNotes] table with the following SQL code:

SELECT OrdensProducao.NumOrdem AS 'OP'
   ,OrdensProducao.NomeCliente AS 'Cliente'
   ,OrdensProducao.Descricao AS 'Descrição' 
   ,OrdensProducao.TipoProduto AS 'Produto'
   ,NomeAgencia AS 'Agência'
   ,OrdensProducao.DtEmissao
   ,SPreco AS 'Valor Fechado'
   ,SCustosComissoes AS 'Comissão'
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros) AS 'Contr Marginal'
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros - SCustosMO) AS 'Lucro'
   ,SUM(ItemNota.ValorTotal) AS 'Faturado'
FROM
    ((OrdensProducao INNER JOIN OrcHdr ON OrdensProducao.NumOrdem = OrcHdr.NumOrcamento)
     LEFT OUTER JOIN ItemNota ON OrcHdr.NumOrcamento = ItemNota.NumOrdem)
     INNER JOIN NotasFiscais ON ItemNota.ObjID_Nota=NotasFiscais.ObjID

WHERE
    (NotasFiscais.NaturezaOperacao IS NULL OR (NOT NotasFiscais.NaturezaOperacao LIKE 'doa*' OR NotasFiscais.NaturezaOperacao LIKE 'reme*')) AND
    (ItemNota.Devolucao IS NULL OR ItemNota.Devolucao<> 'D') AND
    (NotasFiscais.Situacao IS NULL OR NotasFiscais.Situacao = 'N') AND
    (ItemNota.Fatura IS NULL OR ItemNota.Fatura = 'F')

GROUP BY
    OrdensProducao.NumOrdem
   ,OrdensProducao.NomeCliente
   ,OrdensProducao.Descricao 
   ,OrdensProducao.TipoProduto
   ,NomeAgencia
   ,OrdensProducao.DtEmissao
   ,SPreco
   ,SCustosComissoes
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros)
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros - SCustosMO)
ORDER BY
    OrdensProducao.NumOrdem

But I only get the equivalent data from the two tables! If I remove the table [NotesFox], it works perfectly, but I need the 'WHERE' dependent on it. I'm pretty sure it's something about relationships, but I can not figure it out.

    
asked by anonymous 10.12.2014 / 20:53

3 answers

1

The ItemNota table has two IDs (Do not ask me why it was not me who created the DB) and the ID that connects to the Notas table is ObjID_Notas .

On relationships, I did the following:

FROM
    OrdensProducao 
    INNER JOIN OrcHdr ON OrdensProducao.NumOrdem = OrcHdr.NumOrcamento 
    LEFT OUTER JOIN (ItemNota INNER JOIN NotasFiscais ON ItemNota.ObjID_Nota = NotasFiscais.ObjID) ON OrdensProducao.NumOrcamento = ItemNota.NumOrdem 

I do not know if it's the right way, but I managed to do it that way.

    
13.12.2014 / 00:48
1

Try the following (the commented part is where I've just changed):

SELECT OrdensProducao.NumOrdem AS 'OP'
   ,OrdensProducao.NomeCliente AS 'Cliente'
   ,OrdensProducao.Descricao AS 'Descrição' 
   ,OrdensProducao.TipoProduto AS 'Produto'
   ,NomeAgencia AS 'Agência'
   ,OrdensProducao.DtEmissao
   ,SPreco AS 'Valor Fechado'
   ,SCustosComissoes AS 'Comissão'
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros) AS 'Contr Marginal'
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros - SCustosMO) AS 'Lucro'
   ,SUM(ItemNota.ValorTotal) AS 'Faturado'

-- esta é o original.. vou mudar um pouco a forma para entender melhor...
-- FROM
--    ((OrdensProducao INNER JOIN OrcHdr ON OrdensProducao.NumOrdem = OrcHdr.NumOrcamento)
--     LEFT OUTER JOIN ItemNota ON OrcHdr.NumOrcamento = ItemNota.NumOrdem)
--     INNER JOIN NotasFiscais ON ItemNota.ObjID_Nota=NotasFiscais.ObjID

FROM
    -- todas as ordens...
    OrdensProducao
INNER JOIN OrcHdr ON
    -- E que estejam associadas com 'OrcHdr'
    OrdensProducao.NumOrdem = OrcHdr.NumOrcamento
LEFT OUTER JOIN NotasFiscais ON
    -- que TALVEZ possuam notas fiscais
    ItemNota.ObjID_Nota=NotasFiscais.ObjID
--
--  Acho que este ponto esta errado né? Não seria algo como ItemNota.NotaID = NotasFiscais.NotaId ?????????
-- LEFT OUTER JOIN ItemNota ON
--    OrcHdr.NumOrcamento = ItemNota.NumOrdem
--

WHERE
    (NotasFiscais.NaturezaOperacao IS NULL OR (NOT NotasFiscais.NaturezaOperacao LIKE 'doa*' OR NotasFiscais.NaturezaOperacao LIKE 'reme*')) AND
    (ItemNota.Devolucao IS NULL OR ItemNota.Devolucao<> 'D') AND
    (NotasFiscais.Situacao IS NULL OR NotasFiscais.Situacao = 'N') AND
    (ItemNota.Fatura IS NULL OR ItemNota.Fatura = 'F')

GROUP BY
    OrdensProducao.NumOrdem
   ,OrdensProducao.NomeCliente
   ,OrdensProducao.Descricao 
   ,OrdensProducao.TipoProduto
   ,NomeAgencia
   ,OrdensProducao.DtEmissao
   ,SPreco
   ,SCustosComissoes
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros)
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros - SCustosMO)
ORDER BY
    OrdensProducao.NumOrdem

I think the error was in the INNER for the LEFT with the Nota Fiscal ... Already the Notes Items seem to be relating wrong. Make the selection of the NFs first and then you see how they do the items.

    
11.12.2014 / 21:56
1

It seems that the error is equal to Left Join :

SELECT OrdensProducao.NumOrdem AS 'OP'
   ,OrdensProducao.NomeCliente AS 'Cliente'
   ,OrdensProducao.Descricao AS 'Descrição' 
   ,OrdensProducao.TipoProduto AS 'Produto'
   ,NomeAgencia AS 'Agência'
   ,OrdensProducao.DtEmissao
   ,SPreco AS 'Valor Fechado'
   ,SCustosComissoes AS 'Comissão'
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros) AS 'Contr Marginal'
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros - SCustosMO) AS 'Lucro'
   ,SUM(ItemNota.ValorTotal) AS 'Faturado'
FROM
    ((OrdensProducao INNER JOIN OrcHdr ON OrdensProducao.NumOrdem = OrcHdr.NumOrcamento)
     LEFT OUTER JOIN ItemNota ON **OrdensProducao.NumOrdem** = ItemNota.NumOrdem)
     INNER JOIN NotasFiscais ON ItemNota.ObjID_Nota=NotasFiscais.ObjID

WHERE
    (NotasFiscais.NaturezaOperacao IS NULL OR (NOT NotasFiscais.NaturezaOperacao LIKE 'doa*' OR NotasFiscais.NaturezaOperacao LIKE 'reme*')) AND
    (ItemNota.Devolucao IS NULL OR ItemNota.Devolucao<> 'D') AND
    (NotasFiscais.Situacao IS NULL OR NotasFiscais.Situacao = 'N') AND
    (ItemNota.Fatura IS NULL OR ItemNota.Fatura = 'F')

GROUP BY
    OrdensProducao.NumOrdem
   ,OrdensProducao.NomeCliente
   ,OrdensProducao.Descricao 
   ,OrdensProducao.TipoProduto
   ,NomeAgencia
   ,OrdensProducao.DtEmissao
   ,SPreco
   ,SCustosComissoes
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros)
   ,(SPreco - SCustosComissoes - SCustosMat - SCustosTerc - SCustosImpostos - SCustosFin - SCustosVenOutros - SCustosMO)
ORDER BY
    OrdensProducao.NumOrdem
    
20.12.2014 / 02:26