Select multinível

06/05/2020

4

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?
Responder

Posts

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;

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar