Select multinível

SQL

Oracle

SELECT

06/05/2020

Olá pessoal,
Estou tentando fazer um select que mostra todos os itens derivados de um produto.
O problema é que toda a informação está na mesma tabela.

A tabela está assim :

ID; PRODUTO_PAI; PRODUTO_FILHO:

Meu problema é que a os filhos também são pais. neste caso preciso listar pai, os filhos e filhos dos filhos.
Estas informações podem chegar atá a 5 níveis.


Alguém pode me ajudar?
Danrley Ferreira

Danrley Ferreira

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

06/05/2020

tente assim:
WITH cte_tree (nivel, PRODUTO_PAI, PRODUTO_FILHO, TREE) AS (
	SELECT
		2 nivel,
		PRODUTO_PAI,
		PRODUTO_FILHO,
		CAST(LTRIM(RTRIM(PRODUTO_PAI))+' > '+LTRIM(RTRIM(PRODUTO_FILHO)) AS VARCHAR(1024)) TREE
	FROM       
		TABELA
	WHERE
		PRODUTO_PAI = 'X' -- aqui você indica o produto
	UNION ALL
	SELECT 
		ct.nivel+1 nivel,
		t.PRODUTO_PAI, 
		t.PRODUTO_FILHO,
		CAST(ct.TREE + ' > ' + LTRIM(RTRIM(t.PRODUTO_FILHO)) AS VARCHAR(1024)) TREE
	FROM 
		TABELA t
	INNER JOIN cte_tree ct
		ON ct.PRODUTO_FILHO = t.PRODUTO_PAI
)
SELECT 1 nivel, PRODUTO_PAI,  '' PRODUTO_FILHO, PRODUTO_PAI TREE FROM TABELA WHERE PRODUTO_PAI = '1100-110V' and rownum = 1
UNION ALL
SELECT nivel, PRODUTO_PAI, PRODUTO_FILHO, TREE FROM cte_tree
ORDER BY TREE;


pode ser assim também:
WITH cte_tree (nivel, PRODUTO_PAI, PRODUTO_FILHO, TREE) AS (
	SELECT
		2 nivel,
		PRODUTO_PAI,
		PRODUTO_FILHO,
		CAST(LTRIM(RTRIM(PRODUTO_PAI))+' > '+LTRIM(RTRIM(PRODUTO_FILHO)) AS VARCHAR(1024)) TREE
	FROM       
		TABELA
	WHERE
		PRODUTO_PAI = 'X' -- aqui você indica o produto
	UNION ALL
	SELECT 
		ct.nivel+1 nivel,
		t.PRODUTO_PAI, 
		t.PRODUTO_FILHO,
		CAST(ct.TREE + ' > ' + LTRIM(RTRIM(t.PRODUTO_FILHO)) AS VARCHAR(1024)) TREE
	FROM 
		TABELA t
	INNER JOIN cte_tree ct
		ON ct.PRODUTO_FILHO = t.PRODUTO_PAI
)
SELECT 1 nivel, '' PRODUTO_FILHO, PRODUTO_PAI TREE2, PRODUTO_PAI TREE FROM TABELA WHERE PRODUTO_PAI = '1100-110V' and rownum = 1
UNION ALL
SELECT nivel, PRODUTO_FILHO, '    '+REPLICATE('|        ',nivel-2)+'+---- '+PRODUTO_FILHO TREE2, TREE FROM cte_org
ORDER BY TREE;

GOSTEI 0
POSTAR