Postgres के साथ आप एक पुनरावर्ती सामान्य तालिका अभिव्यक्ति का उपयोग कर सकते हैं:
with recursive rel_tree as (
select rel_id, rel_name, rel_parent, 1 as level, array[rel_id] as path_info
from relations
where rel_parent is null
union all
select c.rel_id, rpad(' ', p.level * 2) || c.rel_name, c.rel_parent, p.level + 1, p.path_info||c.rel_id
from relations c
join rel_tree p on c.rel_parent = p.rel_id
)
select rel_id, rel_name
from rel_tree
order by path_info;
SQLFiddle आपके उदाहरण के आधार पर:http://sqlfiddle.com/#!11/59319/19
(मैंने इंडेंट के लिए रिक्त स्थान को अंडरस्कोर से बदल दिया क्योंकि SQLFiddle रिक्त स्थान को सही ढंग से प्रदर्शित नहीं करता है)