Aqui está a tabela e os dados para teste:
CREATE TABLE if not exists cars (
id serial PRIMARY KEY,
parent_code INT,
descr CHARACTER VARYING(50) NOT NULL
);
-- Level 1
INSERT INTO cars(parent_code, descr) VALUES (null, 'Volkswagen');
INSERT INTO cars(parent_code, descr) VALUES (null, 'Tesla');
-- Level 2
INSERT INTO cars(parent_code, descr) VALUES (1, 'Polo');
INSERT INTO cars(parent_code, descr) VALUES (1, 'Golf');
INSERT INTO cars(parent_code, descr) VALUES (2, '3');
INSERT INTO cars(parent_code, descr) VALUES (2, 'S');
INSERT INTO cars(parent_code, descr) VALUES (2, 'X');
-- Level 3
INSERT INTO cars(parent_code, descr) VALUES (3, 'diesel');
INSERT INTO cars(parent_code, descr) VALUES (3, 'gasoline');
INSERT INTO cars(parent_code, descr) VALUES (4, 'diesel');
INSERT INTO cars(parent_code, descr) VALUES (4, 'gasoline');
INSERT INTO cars(parent_code, descr) VALUES (5, 'electric');
INSERT INTO cars(parent_code, descr) VALUES (6, 'electric');
INSERT INTO cars(parent_code, descr) VALUES (7, 'electric');
E aqui está a visão (que eu tentei) com um CTE recursivo:
WITH RECURSIVE tree_cars AS (
select descr
from cars
union all
select concat(' -> ', descr)
from cars
)
--table tree_cars;
select * from tree_cars;
Mas a saída não é o que eu esperava:
Volkswagen
Tesla
Polo
Golf
3
S
X
diesel
gasoline
diesel
gasoline
electric
electric
electric
-> Volkswagen
-> Tesla
-> Polo
-> Golf
-> 3
-> S
-> X
-> diesel
-> gasoline
-> diesel
-> gasoline
-> electric
-> electric
-> electric
Já que eu gostaria de algo como:
Tesla
-> 3
-> electric
-> S
-> electric
-> X
-> electric
Volkswagen
-> Golf
-> diesel
-> gasoline
-> Polo
-> diesel
-> gasoline
Com o CTE recursivo, você pode usar a consulta abaixo para obter sua saída:
DEMO