PgSql递归实现父子层级查询

postgreSql实现递归查询,从父到子,从子到父

使用场景:
有一个分类表,需要根据分类的id查询这个分类下面所有的子分类信息,以及子分类的子分类....

有一个分类表sort

idnameparent_id
1分类1root
1-1分类c1
2-1分类b1-1

需要递归查询根据分类id为1查询出1-1,2-1的子分类和子子分类

查询父到子

WITH RECURSIVE dict AS (
     SELECT *
     FROM sort
     WHERE id= '1'
     union ALL
     SELECT sort.*
     FROM sort,
          dict
     WHERE sort.parent_id = dict.id --查询主表的父id等于虚拟表的id,不能反过来否则查询本身以及父节点
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查询结果:

idnameparent_id
1分类1root
1-1分类c1
2-1分类d1-1

查询从子到父

WITH RECURSIVE dict AS (
     SELECT *
     FROM sort
     WHERE id= '1-1'
     union ALL
     SELECT sort.*
     FROM sort,
          dict
     WHERE sort.id = dict.parent_id  --条件不同
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name
idnameparent_id
1-1分类c1
1分类1root

查询结果如上:查询顺序从子到父

  1. sql中WITH xxxx AS () 是对一个查询子句做别名,同时数据库会对该子句生成临时表;

  2. WITH RECURSIVE 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询

实战查询:从父到子

在这里插入图片描述
从子到父:

在这里插入图片描述


版权声明:本文为Clsrm原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。