locked
Join com registros duplicados RRS feed

  • Pergunta

  • Olá pessoal, estou com um grande problema na minha query.

    Estou montando um relatório em vb.net e minha query está trazendo os registros duplicados, tentei usar o distinct mas não funcionou, ou pelo menos, do jeito que eu usei. Tenho 3 tabelas que se relacionam. 

    1º - estoque

    Campos: cod_nfe, qtdParcelas, data_nota, data_entrada_nfe, valorNota, imposto, formaPagto, codTipoPagamento.

    2º estoqueProduto

    Campos: cod_nfe, cod_Produto, nome_produto, valorUnitario, qtdProduto, valorTotal.

    3º - estoqueParcelas

    Campos: cod_nfe, qdParcelas, parcela, valorParcela, statusParcela, dataParcela, data_baixa

    Minha query :

    SELECT  E.cod_Nfe, 
            E.data_Nota, 
            E.data_Entrada_Nfe, 
            E.formaPagto, 
            E.imposto, 
            E.valorNota, 
            EP.parcela, 
            EP.dataParcela, 
            EP.statusParcela, 
            EP.valorParcela, 
            EP.data_baixa, 
            EPR.cod_Produto, 
            EPR.nome_Produto, 
            EPR.qtdProduto, 
            EPR.valorUnitario, 
            EPR.valorTotal
    
    FROM estoque E inner JOIN estoqueParcelas EP 
    
    ON EP.cod_Nfe = E.cod_Nfe inner JOIN estoqueProduto EPR 
    
    ON EPR.cod_Nfe = E.cod_Nfe
    
    WHERE E.cod_Nfe = 'SJDI2398') //Exemplo

    Essa query me retorna os seguintes campos:

    Eu gostaria que as parcelas e os produtos não viessem duplicados, já as informações da nota não tá dando problema no meu relatório. As informações da nota eu coloco em campos de texto, já as parcelas e produtos, em tabelas. Aí fica duplicado.

    Quem puder me ajudar, agradeço !!

    segunda-feira, 17 de novembro de 2014 16:18

Respostas

  • Ivan,

        Esse tipo de problema é comum e é apenas uma falha de interpretação, e não uma falha do SQL Server. Quando você faz um JOIN, você está utilizando parte da teoria dos conjuntos e especificamente, o INNER JOIN indica que você estará associando registros que são comuns entre duas (ou mais) tabelas. O problema neste caso, é que normalmente uma das tabelas possui um único registro e a sua tabela relacionada possuirá um ou mais registros que satisfazem a sua consulta. O melhor exemplo neste caso é, por exemplo, o caso de um cadastro de Municipios e Estados. Veja o exemplo:

     Tabela Municipios

    CodMunicipio   Municipio     CodEstado

    01                    São Paulo            01

    02                    Santos                 01

    03                    Rio de Janeiro      02

    Tabela Estados

    CodEstado       Estado

    01                     SP

    02                     RJ

    -----

    Query com Join entre as duas tabelas

    Select Municipio, Estado from Municipios M

    Inner join Estados E

    on M.CodEstado = E.Codestado

    ----

    Resultado

    Municipio               Estado

    São Paulo              SP

    Santos                   SP

    Rio de janeiro        RJ

    Tudo correto até aqui, concorda? Não há nenhuma falha no SQL, ele está corretamente associando o estado de SP aos dois municípios da tabela Municipios... Mas surge então a grande pergunta... Porque no seu caso ele está duplicando???? Note que a tabela Municipios tem dois registros que correspondem ao estado de SP, e ele "duplicou" os registros de SP na Coluna Estado... E esse comportamento está correto! Isso também está acontecendo na sua tabela, pois ou a sua tabela Parcelas ou a sua tabela de Produtos possuem mais de um registro para o mesmo registro da tabela Estoque e que está associado ao Cod_NFE. Faça um teste, cadastre um estoque de produto com apenas uma parcela e apenas um produto. Você verá que não acontece a "falha". Para que você resolva o seu problema, você tem algumas soluções, dependendo do que você precisa no seu caso. Se você quiser apenas informações da tabela Estoque, retire as tabelas Parcelas e Produtos do seu join, se você precisa de informações dessas tabelas faça uso de funções de agregação, como o MAX, MIN, SUM, etc.  em conjunto com a cláusula GROUP BY, dependendo do que for necessário para dar a informação correta para você.

        Espero ter ajudado!


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    segunda-feira, 17 de novembro de 2014 17:23
    Moderador
  • Está duplicando tanto as parcelas e os produtos:

    Nessa nota que coloquei de exemplo, têm 3 parcelas e 2 produtos na nota, está duplicando tudo, literalmente! Eu preciso que apareça os 2 produtos e as 3 parcelas.

    Mas preciso que as parcelas venham junto da nota, pra poder exibir no relatório.

    Não sei se vai ajudar na resolução, mas isso é o que aparece no meu relatório.

    Tem alguma outra forma pra eu fazer o select das parcelas por fora da query e trazer elas ?

    Minhas parcelas, no banco, não possuem numeração, eu simplesmente coloquei nelas o cod_nfe que recebe para cada parcela o código da nota. 

    Segue o código..

    SELECT  E.cod_Nfe, 
            E.data_Nota, 
            E.data_Entrada_Nfe, 
            E.formaPagto, 
            E.imposto, 
            E.valorNota, 
            EPR.cod_Produto, 
            EPR.nome_Produto, 
            EPR.qtdProduto, 
            EPR.valorUnitario, 
            EPR.valorTotal
    FROM estoque E inner JOIN estoqueProduto EPR 
    ON EPR.cod_Nfe = E.cod_Nfe
    WHERE E.cod_Nfe = 'SJDI2398') //Exemplo
    
    
    
    SELECT  EP.parcela, 
            EP.dataParcela, 
            EP.statusParcela, 
            EP.valorParcela, 
            EP.data_baixa
    FROM	estoqueParcelas EP 
    WHERE   EP.cod_Nfe = 'SJDI2398') //Exemplo



    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    segunda-feira, 17 de novembro de 2014 17:22
  • Deleted
    segunda-feira, 17 de novembro de 2014 17:25

Todas as Respostas

  • Ivansnp,

    Sua query esta retornando mais de um registro porque você tem informações diferentes em alguns campos.

    Você quer retornar apenas um registro, terá que abrir mão das informações das outras parcelas, você pode colocar na sua clausula "where" para retornar somente a parcela 1.

    WHERE E.cod_Nfe = 'SJDI2398'
    and EP.parcela = 1


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    segunda-feira, 17 de novembro de 2014 16:42
  • Está duplicando tanto as parcelas e os produtos:

    Nessa nota que coloquei de exemplo, têm 3 parcelas e 2 produtos na nota, está duplicando tudo, literalmente! Eu preciso que apareça os 2 produtos e as 3 parcelas.

    Mas preciso que as parcelas venham junto da nota, pra poder exibir no relatório.

    Não sei se vai ajudar na resolução, mas isso é o que aparece no meu relatório.

    Tem alguma outra forma pra eu fazer o select das parcelas por fora da query e trazer elas ?

    Minhas parcelas, no banco, não possuem numeração, eu simplesmente coloquei nelas o cod_nfe que recebe para cada parcela o código da nota. 

    • Editado Ivansnp segunda-feira, 17 de novembro de 2014 16:57
    segunda-feira, 17 de novembro de 2014 16:51
  • Está duplicando tanto as parcelas e os produtos:

    Nessa nota que coloquei de exemplo, têm 3 parcelas e 2 produtos na nota, está duplicando tudo, literalmente! Eu preciso que apareça os 2 produtos e as 3 parcelas.

    Mas preciso que as parcelas venham junto da nota, pra poder exibir no relatório.

    Não sei se vai ajudar na resolução, mas isso é o que aparece no meu relatório.

    Tem alguma outra forma pra eu fazer o select das parcelas por fora da query e trazer elas ?

    Minhas parcelas, no banco, não possuem numeração, eu simplesmente coloquei nelas o cod_nfe que recebe para cada parcela o código da nota. 

    Segue o código..

    SELECT  E.cod_Nfe, 
            E.data_Nota, 
            E.data_Entrada_Nfe, 
            E.formaPagto, 
            E.imposto, 
            E.valorNota, 
            EPR.cod_Produto, 
            EPR.nome_Produto, 
            EPR.qtdProduto, 
            EPR.valorUnitario, 
            EPR.valorTotal
    FROM estoque E inner JOIN estoqueProduto EPR 
    ON EPR.cod_Nfe = E.cod_Nfe
    WHERE E.cod_Nfe = 'SJDI2398') //Exemplo
    
    
    
    SELECT  EP.parcela, 
            EP.dataParcela, 
            EP.statusParcela, 
            EP.valorParcela, 
            EP.data_baixa
    FROM	estoqueParcelas EP 
    WHERE   EP.cod_Nfe = 'SJDI2398') //Exemplo



    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    segunda-feira, 17 de novembro de 2014 17:22
  • Ivan,

        Esse tipo de problema é comum e é apenas uma falha de interpretação, e não uma falha do SQL Server. Quando você faz um JOIN, você está utilizando parte da teoria dos conjuntos e especificamente, o INNER JOIN indica que você estará associando registros que são comuns entre duas (ou mais) tabelas. O problema neste caso, é que normalmente uma das tabelas possui um único registro e a sua tabela relacionada possuirá um ou mais registros que satisfazem a sua consulta. O melhor exemplo neste caso é, por exemplo, o caso de um cadastro de Municipios e Estados. Veja o exemplo:

     Tabela Municipios

    CodMunicipio   Municipio     CodEstado

    01                    São Paulo            01

    02                    Santos                 01

    03                    Rio de Janeiro      02

    Tabela Estados

    CodEstado       Estado

    01                     SP

    02                     RJ

    -----

    Query com Join entre as duas tabelas

    Select Municipio, Estado from Municipios M

    Inner join Estados E

    on M.CodEstado = E.Codestado

    ----

    Resultado

    Municipio               Estado

    São Paulo              SP

    Santos                   SP

    Rio de janeiro        RJ

    Tudo correto até aqui, concorda? Não há nenhuma falha no SQL, ele está corretamente associando o estado de SP aos dois municípios da tabela Municipios... Mas surge então a grande pergunta... Porque no seu caso ele está duplicando???? Note que a tabela Municipios tem dois registros que correspondem ao estado de SP, e ele "duplicou" os registros de SP na Coluna Estado... E esse comportamento está correto! Isso também está acontecendo na sua tabela, pois ou a sua tabela Parcelas ou a sua tabela de Produtos possuem mais de um registro para o mesmo registro da tabela Estoque e que está associado ao Cod_NFE. Faça um teste, cadastre um estoque de produto com apenas uma parcela e apenas um produto. Você verá que não acontece a "falha". Para que você resolva o seu problema, você tem algumas soluções, dependendo do que você precisa no seu caso. Se você quiser apenas informações da tabela Estoque, retire as tabelas Parcelas e Produtos do seu join, se você precisa de informações dessas tabelas faça uso de funções de agregação, como o MAX, MIN, SUM, etc.  em conjunto com a cláusula GROUP BY, dependendo do que for necessário para dar a informação correta para você.

        Espero ter ajudado!


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    segunda-feira, 17 de novembro de 2014 17:23
    Moderador