Duplicate results when searching with POSTGRES

0

I am doing a search in the database where I perform some JOIN in different tables. In the SQL that inseir below I make a join with the commodity_category_table table where the product id must be present in it to return with which categories it is compatible. In this table product_category_compatibility has only the product id and category id. When I run this SQL it returns me the listing of the products but it is duplicating the listed records. I tried to use group by passing the product id but it returns error saying that another parameter must be passed in group by and as I add the parameters in group by it continues to return the same error. Below is the SQL and error examples

SELECT produto.id,
   produto.nome,
   produto.valor,
   loja.id,
   loja.nome,
   loja.situacao,
   categoria.id,
   categoria.id_pai,
   categoria.nome,
   categoria.nome_pai,
FROM produto_derivacao
JOIN produto ON produto.id = produto_derivacao.produto_id
JOIN loja ON loja.id = produto.loja_id
JOIN categoria ON categoria.id = produto.categoria_id
JOIN produto_categoria_compativel ON produto.id = produto_categoria.produto_id
GROUP BY produto.id

Examples of errors:

coluna "loja.id" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação
coluna "categoria.id" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação
coluna "categoria.id_pai" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação
    
asked by anonymous 01.12.2015 / 14:39

2 answers

1

You do not need to use group by because there is no aggregate function in the query.

Use distinct to remove duplicate items and change joins to left or right depending on the position of the table.

Below is the SQL:

SELECT DISTINCT (produto.id),
   produto.nome,
   produto.valor,
   loja.id,
   loja.nome,
   loja.situacao,
   categoria.id,
   categoria.id_pai,
   categoria.nome,
   categoria.nome_pai,
FROM produto_derivacao
RIGH JOIN produto ON produto.id = produto_derivacao.produto_id
LEFT JOIN loja ON loja.id = produto.loja_id
JOIN categoria ON categoria.id = produto.categoria_id
LEFT JOIN produto_categoria_compativel ON produto.id = produto_categoria.produto_id
    
01.12.2015 / 14:45
1
select 
    produto_id,
    nome,
    valor,
    loja_id,
    nome,
    situacao,
    categoria_id,
    id_pai,
    nome,
    nome_pai
from (
    select distinct
        produto.id as produto_id,
        produto.nome,
        produto.valor,
        loja.id as loja_id,
        loja.nome,
        loja.situacao,
        categoria.id as categoria_id,
        categoria.id_pai,
        categoria.nome,
        categoria.nome_pai,
        COLUNA_PARA_ORDENACAO
    from
        produto_derivacao
        join
        produto on produto.id = produto_derivacao.produto_id
        join
        loja on loja.id = produto.loja_id
        join
        categoria on categoria.id = produto.categoria_id
        join
        produto_categoria_compativel on produto.id = produto_categoria.produto_id
) s
order by COLUNA_PARA_ORDENACAO
    
02.12.2015 / 17:56