Como juntar uma tabela de produtos a 2 categorias e 2 subcategorias?

Boa tarde galera estou com uma dúvida aqui no serviço e estou precisando de um help de voces…
No caso eu tenho 1 produto e este produto pode ter 2 categorias ou mais e pode ter 2 subcategorias ou mais…
A minha dúvida é como eu posso juntar isso usando o BD PostGreSQL??
Ja usei varios joins, mais nada resolveu…
Estou usando o seguinte select:

SELECT p.id,p.nome,p.descricao,p.id_categoria,p.id_categoria2,p.id_subcategoria,p.id_subcategoria2 FROM prato p
INNER JOIN categoria c ON (c.id = p.id_categoria OR c.id = p.id_categoria2)
WHERE (p.id_categoria = ‘3’ OR p.id_categoria2 = ‘2’)
AND p.ativo = '1’
AND c.ativo = '1’
AND p.id_tipo_prato <> 3
ORDER BY p.nome

Aguardo… flwsss

Pelo que entendi, as relações corretas são:
Um Produto pode pertencer a mais de uma Categoria. E uma categoria, pode ter mais de um produto, logo M:N
Um Produto pode pertencer a mais de uma subCategoria. E uma subcategoria, pode ter mais de um produto, logo M:Z

Vejamos teus critérios:

SELECT
p.id,
p.nome,
p.descricao,
p.id_categoria,
p.id_categoria2,
p.id_subcategoria,
p.id_subcategoria2
FROM
prato p
INNER JOIN 
categoria c 
ON
(c.id = p.id_categoria OR c.id = p.id_categoria2)
WHERE
(p.id_categoria = '3' OR p.id_categoria2 = '2')
AND p.ativo = '1'
AND c.ativo = '1'
AND p.id_tipo_prato <> 3
ORDER BY p.nome 

Pelo que aparenta, você está quebrando a integridade do banco. Se um produto pode estar relacionado a mais de uma categoria e uma categoria terá mais de 1 produto, é uma relação N:M. Ou seja, seria mais indicado criar uma tabela relacionando as duas (categoria e produto). O mesmo se aplica à subcategoria.

Por que?
Ora, simples, você poderia usar esta tabela para eliminar isto

p.id_categoria,
p.id_categoria2,
p.id_subcategoria,
p.id_subcategoria2

E se o bendito produto estiver relacionado à 345 subcategorias?

Caso não seja você o sujeito que criou o banco e as tabelas sugiro solicitar estas alterações. Senão, altere logo.

Senão, será bem difícil criar uma query de consulta.

Muito obrigado, amigo.
No caso de ser N:M tanto as categorias quanto o produto eu entendi que realmente seria melhor criar outra tabela.
Agora suponhamos que esse produto seja relacionado no máximo a 2 categorias.
Teria algo a fazer sem que precisasse criar essa outra tabela.
Lembrando que isso se trata de apenas uma manutenção!

Grato!

Bom, vamos pensar.
Se são somente 2 categorias, sim, você pode colocar categoria1 e categoria2 como colunas do sujeito.

Assim, o SELECT básico seria

SELECT
p.id,
p.nome,
p.descricao,
p.id_categoria,
p.id_categoria2,
p.id_subcategoria,
p.id_subcategoria2
FROM
prato p
INNER JOIN
Categoria C
ON
c.id in (p.id_categoria, p.id_categoria2)
//continua aqui

Acho que a idéia é essa.

Bom amigo…
Como não fui eu quem criei a tabela não pude mexer na estrutura do Banco de Dados, como era apenas uma manutenção e tinha
que ser algo meio rápido, pensei um pouco na sua resposta e cheguei a uma solução.

SELECT
p.id,
p.nome,
p.descricao,
p.id_categoria,
p.id_categoria2,
p.id_subcategoria,
p.id_subcategoria2
FROM
prato p
INNER JOIN
categoria c
ON
(c.id = p.id_categoria OR c.id = p.id_categoria2)
WHERE
(p.id_categoria = ‘1’ OR p.id_categoria2 = ‘2’)
AND p.ativo = '1’
AND c.ativo = '1’
AND p.id_tipo_prato <> 3
GROUP BY id
ORDER BY p.nome

Colocando um group by eu consegui suprir minha necessidade, que antes estava trazendo na tabela de forma duplicada o meu produto atendendo as 2 situações de categoria.
Assim mesmo ele pertencendo a mais de uma categoria, ele será trazido apenas uma vez o produto.

Vlws pelo Help Drsmachado e que esse tópico possa servir pra outros que passarem por isso.

RESOLVIDO!

Ia sugerir usar distinct, mas o group by deve resolver em definitivo.