【oracle】oracle递归查询树形表所有节点和每个子节点的根节点语法糖

前言

  最近在工作中遇到了在树形结构数据中查询出每个数据的顶级节点的需求,使用START WITH 语法不能满足一次性查询的效果,所以这里选用了with定义一个递归查询,然后通过表连接来实现通过一个sql查询出所有节点和每个子节点的根节点的效果,如果大家在工作中遇到类似情况,可以直接参考这篇博客,以下是具体用法:

1、例如有一张BANK(银行)表数据如下

银行树形表

2、执行以下sql语句

WITH tree (ID, PARENT_ID, top_id,top_name)
AS (
    -- 查询顶级根节点数据,例如PARENT_ID=NULL代表顶级节点
    SELECT ID, PARENT_ID, ID AS top_id,NAME as top_name
    FROM BANK
    WHERE PARENT_ID IS NULL

    UNION ALL

    -- 地柜查询,通过父节点ID关联,递归向上查找直到顶级根节点为止
    SELECT t.ID, t.PARENT_ID, tree.top_id, tree.top_name
    FROM BANK t
    JOIN tree ON t.PARENT_ID = tree.ID
)
-- 最终通过左连接匹配需要的字段(如果上面WITH中字段都定义好了也可以直接用 SELECT * FROM TREE查询,省去了连接表的耗时)
SELECT b.ID "银行ID",b.NAME "银行名称",b.BANK_LEVEL "银行层级", tree.top_id "所属顶级银行ID", tree.top_name "所属顶级银行"
FROM BANK b
LEFT JOIN tree ON b.ID = tree.ID;

3、查询结果

在这里插入图片描述
完结撒花,欢迎订阅专栏!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值