前言
最近在工作中遇到了在树形结构数据中查询出每个数据的顶级节点的需求,使用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、查询结果
完结撒花,欢迎订阅专栏!