打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PostgreSQL递归查询上下级节点树(从子到父、从父到子)
    • 字典表结构(dictionary)
    • 字典表数据
    • 开始递归查询
      • 向下递归(从父到子)
      • 向上递归(从子到父)
    • 结语

场景:
数据库中的数据存在父子关系(单继承,每一条记录只有一个父记录). 如果要查询一条记录以及他的所有子记录,或者要查询一条记录以及他的所有父记录.那么递归查询就再合适不过了.可以简化复杂的SQL语句。
现在数据库有一张dictionary表,用于存放业务相关字典项

字典表结构(dictionary)

id,name,parent_id

字典表数据

idnameparentId
1字典1NULL
1-1字典1-11
1-2字典1-21
2字典2NULL
2-1字典2-12

开始递归查询

向下递归(从父到子)

WITH RECURSIVE dict AS (
     SELECT *
     FROM dictionary
     WHERE id= '1'
     union ALL
     SELECT dictionary.*
     FROM dictionary,
          dict
     WHERE dictionary.parent_id = dict.id
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查询结果

idnameparentId
1字典1NULL
1-1字典1-11
1-2字典1-21

向上递归(从子到父)

WITH RECURSIVE dict AS (
     SELECT *
     FROM dictionary
     WHERE id= '2-1'
     union ALL
     SELECT dictionary.*
     FROM dictionary,
          dict
     WHERE dictionary.id = dict.parent_id
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查询结果

idnameparentId
2字典2NULL
2-1字典2-12

结语

  1. sql中WITH xxxx AS () 是对一个查询子句做别名,同时数据库会对该子句生成临时表;
  2. WITH RECURSIVE 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询



//todo 此种方式都是查询一棵树,如果结果list中有多棵截断的树,需要递归查出来最顶层的parentId节点集合(就是找出 父节点对象不存在的就是顶层),然后循环这个集合挨个拼成这些树,并且再放进一个tree集合中,从而形成一个多树的json,但是此种方法有一个很大的问题:效果上看导致小树的顶层位置都从最前面开始了,与实际不否,实际中应该是错开的几棵树,综述实际开发中不会有这样的结果list。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
常见数据库设计(1)——字典数据
使用Python读取,写入和解析JSON
Stardict 81部中文词典下载
Oracle用Start with...Connect By子句递归查询
在线词典
Oracle中用LogMiner分析重做及归档日志2
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服