Я использую Postgres 9.1, и у меня есть таблица с иерархией генеалогического дерева. Эта таблица называется родительской и содержит два внешних ключа: один для родителя и один для дочернего элемента в отношении. Следующий SQL-запрос (по большей части украденный из документации Postgres) работает, но проходит по дереву как вверх, так и вниз:
with recursive temp(child, parent, depth, path, cycle) as
(select child, parent, 1, array[child], false
from parents
where parent = 149
union all
select parents.child, parents.parent, temp.depth + 1, path || parents.child, parents.child = any(path)
from temp, parents
where parents.child = temp.parent)
select distinct c1.name as child_name, c2.name as parent_name
from temp
join people c1 on temp.child = c1.id
join people c2 on temp.parent = c2.id;
Parent 149 является корневым узлом обхода.
На выходе имеется одно поколение детей и все поколения предков из 149. В идеале запрос должен спускаться по генеалогическому дереву и не иметь поколений предков.
where parents.child = temp.parent
наwhere parents.parent = temp.child
? - person wildplasser   schedule 11.07.2012