sql - Postgresql 查询获取存储在单个表中的 n 级父子关系

标签 sql postgresql recursion database

我有一张表示父子关系的表。关系可以深入 n 级。

我使用以下查询创建了一个示例表:

CREATE SEQUENCE relations_rel_id_seq
    INCREMENT BY 1
    NO MAXVALUE
    NO MINVALUE
    CACHE 1;
CREATE TABLE relations(
    rel_id bigint DEFAULT nextval('relations_rel_id_seq'::regclass) NOT NULL PRIMARY KEY,
    rel_name text,
    rel_display text,
    rel_parent bigint
);

SQLFiddle

我需要查询表,分层显示父子关系。我仍然不知道如何使用 sql 查询来查询 n 级深度。

对于 sqlfiddle,例如,预期的输出层次结构:

rel1
    rel11
        rel111
        rel112
            rel1121
rel2
    rel21
        rel211
        rel212

注意:n-level 中的值 n 未知。

数据库设计:

Is there any better way such a relation can be expressed in the database for easy querying.?

最佳答案

在 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 不能正确显示空格)

关于sql - Postgresql 查询获取存储在单个表中的 n 级父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659856/

相关文章:

mysql - 如何从父表复制到子表,其中 1 列分为 3 个不同的列

sql - 为什么 DateAdd() 和 DATEDIFF() 给出不同的结果,哪个性能更好?

mysql - 在sql查询中计算距离(pythagoras)和运行计数

java - Heroku 和 Java - 没有合适的驱动程序

postgresql - Postgres : Get numbers of affected rows in statement trigger

sql - Ms Access 连接不同数据库中的表

sql - 选择最后 n 行而不使用 order by 子句

java - 如何在Java中使用递归来解决非负子集和?

javascript - 如何提出正确的递归解决方案

java - C/C++/Java/C# 中的大量递归解决方案