PostgreSQL如何实现三层父子层级自关联表查询
3级层级展平查询实现
你的表通过parent_place_id存储上下级关联,要展平祖父、父亲、孩子3层为单行,直接对同一张表做两次自连接即可,不需要复杂递归:
-- 假设表名为 place SELECT gf.place_id AS id_Grandfather, gf.name AS name_Grandfather, dad.place_id AS id_Dad, dad.name AS name_Dad, child.place_id AS id_Child, child.name AS name_child FROM place child -- 关联当前节点的父级(父亲层) INNER JOIN place dad ON child.parent_place_id = dad.place_id -- 关联父亲节点的父级(祖父层) INNER JOIN place gf ON dad.parent_place_id = gf.place_id -- 限定祖父为最顶层无上级的节点 WHERE gf.parent_place_id IS NULL;
补充说明
- 上述语句只会返回完整3代链路的数据,如果需要保留不足3代的节点(比如没有祖父、只有父子两层的记录),把
INNER JOIN替换为LEFT JOIN即可 - 该写法仅适用于固定3层级的展平场景,如果后续需要支持任意深度的层级路径查询,可以使用对应数据库支持的递归CTE语法实现
内容的提问来源于stack exchange,提问作者Nguyễn Hoài Nam
相关产品推荐
相关产品推荐

