Usuário com melhor resposta
Join com registros duplicados

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
- Marcado como Resposta Roberto F FonsecaModerator sexta-feira, 21 de novembro de 2014 16:03
segunda-feira, 17 de novembro de 2014 17:23Moderador -
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
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 18 de novembro de 2014 19:06
segunda-feira, 17 de novembro de 2014 17:22 -
Deleted
- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 18 de novembro de 2014 09:17
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 18 de novembro de 2014 19:06
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
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 18 de novembro de 2014 19:06
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
- Marcado como Resposta Roberto F FonsecaModerator sexta-feira, 21 de novembro de 2014 16:03
segunda-feira, 17 de novembro de 2014 17:23Moderador