Componentes de produtos

SQL para explodir as matérias primas dos produtos em uma ficha técnica

PROD.COMPONENTES_PRODUTOS.FAQ-143878
O SQL abaixo permite listar todas as matérias-primas de um produto, "explodindo" os produtos intermediários, considerando que exista no máximo 5 níveis de explosão.

Código
select p.produto
, p.descricao
, coalesce(p5.produto, p4.produto, p3.produto, p2.produto, p1.produto) as componente
, coalesce(p5.descricao, p4.descricao, p3.descricao, p2.descricao, p1.descricao) as descricao_componente
, coalesce(c5.quantidade, 1) * coalesce(c4.quantidade, 1) * coalesce(c3.quantidade, 1) * coalesce(c2.quantidade, 1) * coalesce(c1.quantidade, 0) as quantidade
, case when c5.id is not null then 5
      when c4.id is not null then 4
      when c3.id is not null then 3
      when c2.id is not null then 2
      when c1.id is not null then 1
      else 0 end as nivel
from produtos p
left join fichas_tecnicas f1 on f1.id = p.ficha_tecnica_principal_id
left join componentes_produtos c1 on c1.ficha_tecnica_id = f1.id
left join produtos p1 on p1.id = c1.componente_produto_id

left join fichas_tecnicas f2 on f2.id = p1.ficha_tecnica_principal_id
left join componentes_produtos c2 on c2.ficha_tecnica_id = f2.id
left join produtos p2 on p2.id = c2.componente_produto_id

left join fichas_tecnicas f3 on f3.id = p2.ficha_tecnica_principal_id
left join componentes_produtos c3 on c3.ficha_tecnica_id = f3.id
left join produtos p3 on p3.id = c3.componente_produto_id

left join fichas_tecnicas f4 on f4.id = p3.ficha_tecnica_principal_id
left join componentes_produtos c4 on c4.ficha_tecnica_id = f4.id
left join produtos p4 on p4.id = c4.componente_produto_id

left join fichas_tecnicas f5 on f5.id = p4.ficha_tecnica_principal_id
left join componentes_produtos c5 on c5.ficha_tecnica_id = f5.id
left join produtos p5 on p5.id = c5.componente_produto_id

Atenção
Esse SQL é apenas uma ideia. Ele deve ser melhorado agregando as informações do item de engenharia para gerar um resultado final tratando adequadamente cada um dos diferentes tipos de itens de engenharia (matérias-primas, setups, processos, insumos, etc.).