Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据

PostgreSQL递归查询(从子到父、从父到子)

场景:
数据库中的数据存在父子关系(单继承,每一条记录只有一个父记录). 如果要查询一条记录以及他的所有子记录,或者要查询一条记录以及他的所有父记录.那么递归查询就再合适不过了.可以简化复杂的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 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 阿菊的OpenCv(五)——error: (-215:Assertion failed) !_descriptors.empty() in function ‘add‘问题解决

下一篇: 数组数据通过sql语句转为数据库表衔接到from或join后进行直接或关联查询

精华推荐