GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Linhas duplicadas


#1

boa tarde galera possuo a seguinte query sql

select f.nome,count(b.cod_fabricante),count(p.cod_fabricante)
from bebidas as b
inner join fabricantes as f
on f.codigo=b.cod_fabricante
inner join produtos as p
on f.codigo=p.cod_fabricante
group by f.nome;

a query deveria me retornar quantidade de produtos e bebidas e o nome de cada fabricante, porém ela está multiplicando as linhas e me retornando o resultado errado, com 1 inner join apenas, o código funciona perfeitamente, alguém poderia me ajudar com o que pode estar ocorrendo ?


#2

Veja se alguma dessas formas ajuda:

Forma 1:

 ...
 group by f.nome, b.cod_fabricante, p.cod_fabricante;

Forma 2:

 ...count(distinct b.cod_fabricante),count(distinct p.cod_fabricante)...

#3

group by f.nome, b.cod_fabricante, p.cod_fabricante; me retorna o mesmo resultado…

count(distinct b.cod_fabricante),count(distinct p.cod_fabricante) me retorna todos resultados como 1.


#4

Caso ajude, minhas tabelas são
cidade = (cod,nome)
fabricantes=(codigo,nome,cod_cidade)
bebidas=(codigo,descricao,cod_fabricante)
produtos=(codigo,descricao,cod_fabricante)

acredito que dê para ter uma noção melhor.


#5

Agora que percebi, vc deve contar pelo codigo tanto do produto quanto da bebida, e não pelo cod_fabricante de cada um (o cod_fabricante serve apenas para juntar as tabelas)…

select f.nome,count(b.codigo),count(p.codigo) 
from bebidas as b
inner join fabricantes as f on f.codigo=b.cod_fabricante
inner join produtos as p on f.codigo=p.cod_fabricante
group by f.nome;

Isso na teoria não deveria duplicar… agora se mesmo assim contar errado, vc precisa ver se todos os produtos e bebidas possuem a mesma quantidade de fabricantes, caso o contrário precisará usar left e não inner join:

select f.nome,count(b.codigo),count(p.codigo) 
from fabricantes as f
left join bebidas as b on b.cod_fabricante = f.codigo 
left join produtos as p on p.cod_fabricante = f.codigo
group by f.nome;

Perceba que mudei a ordem das tabelas ok? isso afeta os joins, pesquise mais a respeito…

Dessa forma ele consegue contar corretamente apenas onde encontrar bebidas vinculadas ou produtos vinculados pegou?

Por exemplo, se na tabela de bebidas vc tem 10 para um fabricante X e na produtos vc tem 5 para o mesmo fabricante, com INNER ele vai contar 10 para cada 1, usando LEFT ele irá contar 10 pra um e 5 pra outro… espero ter conseguido te passar a lógica…