私は Postgres 9.1 を使用しており、ファミリー ツリー階層を含むテーブルがあります。このテーブルは親と呼ばれ、リレーションシップの親用と子用の 2 つの外部キーがあります。次の 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;
親 149 は、トラバーサルのルート ノードです。
出力には、1 世代の子と 149 のすべての世代の先祖が含まれます。理想的には、クエリは家系図をたどり、先祖の世代はありません。