По Вашему описанию я предполагаю, вы имеете в виду breadth- первого порядка, что может быть сделано Исли с помощью рекурсивных запросов (PostgreSQL 8.4+):
WITH RECURSIVE tree
AS
(
SELECT
node_name, id, parent_id, NULL::varchar AS parent_name
FROM foo
WHERE parent_id IS NULL
UNION
SELECT
node_name, f1.id, f1.parent_id, tree.node_name AS parent_name
FROM
tree
JOIN foo f1 ON f1.parent_id = tree.id
)
SELECT node_name, empno, parent_id, node_name FROM tree;
Вы также можете использовать глубину первого порядка с использованием следующих SQL:
WITH RECURSIVE tree
AS
(
SELECT
node_name, id, parent_id, NULL::varchar AS parent_name, id::text AS path
FROM foo WHERE parent_id IS NULL
UNION
SELECT
node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || '-' || f1.id::text AS path
FROM
tree
JOIN foo f1 ON f1.parent_id = tree.id
)
SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;
Thx для этого я не знал о существующих запросах WITH в Postgres – canni
Я думаю, что мы не можем использовать оператор UNION в разделе WITH – Fer
Ваше решение для порядок глубин не будет работать для id с разным количеством цифр. – synergetic