Duplicate results when searching with POSTGRES

Asked

Viewed 614 times

0

I’m performing a database search where I perform some JOIN on different tables. In the SQL that inseir below I make a Join with the product table_categoria_compatible where the product id must be present in it to return with which categories it is compatible. In this product table_categoria_compativel has only the product id and the 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 should be passed in group by and as I keep adding the parameters in group by it keeps returning the same error. Below is the SQL and the 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

2 answers

1

You don’t need to use the group by, because there is no aggregation function in the query.

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

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
  • Herivelton Paiva, if you use the distinct it of the stick in order by "Error: for SELECT DISTINCT, ORDER BY expressions should appear in the selection list"

  • Just add the same thing you have in your order by in the select clause.

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.