saj*_*i89 20 sql database postgresql recursion
我有一张表格表示亲子关系.这种关系可以深入到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
);
Run Code Online (Sandbox Code Playgroud)
我需要查询表并分层显示父子关系.关于如何使用sql查询查询n级深度,我仍然没有想到.
对于sqlfiddle,例如,预期的输出层次结构:
rel1
rel11
rel111
rel112
rel1121
rel2
rel21
rel211
rel212
Run Code Online (Sandbox Code Playgroud)
注意:值n,in n-level是未知的.
数据库设计:
有没有更好的方法可以在数据库中表达这种关系以便于查询.
a_h*_*ame 44
使用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;
Run Code Online (Sandbox Code Playgroud)
SQLFiddle基于您的示例:http://sqlfiddle.com/#!11/59319/19
(我用下划线替换了用于缩进的空格,因为SQLFiddle没有正确显示空格)
| 归档时间: |
|
| 查看次数: |
23516 次 |
| 最近记录: |