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 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询

实战查询:从父到子

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

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值