You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

DB2中如何通过SELECT查询同一张表的父子层级数据?

查询同一张表的父子层级数据

嘿,要搞定这个父子层级数据的输出需求其实不难,关键是利用数据库的树形遍历能力,下面我会针对不同数据库版本给出具体的实现方案:

方案1:使用递归CTE(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)

如果你的数据库支持WITH RECURSIVE(递归公共表表达式),这是处理树形结构最灵活的方式。我们可以先抓取所有根节点(parentnull的记录),然后递归遍历它们的子节点,同时生成一个排序路径来保证父节点在前、子节点紧随其后的顺序:

WITH RECURSIVE tree AS (
    -- 第一步:获取所有根节点,同时生成初始排序路径
    SELECT 
        wonum, 
        parent, 
        woid,
        CAST(wonum AS CHAR(255)) AS sort_path
    FROM t7
    WHERE parent IS NULL
    
    UNION ALL
    
    -- 第二步:递归查找子节点,拼接父节点的排序路径
    SELECT 
        t.wonum, 
        t.parent, 
        t.woid,
        CONCAT(tree.sort_path, ',', CAST(t.wonum AS CHAR(255))) AS sort_path
    FROM t7 t
    JOIN tree ON t.parent = tree.wonum
)
-- 最终按排序路径输出,就能得到父子层级的顺序
SELECT wonum, parent, woid
FROM tree
ORDER BY sort_path;

这个方案的核心是sort_path:每个根节点的路径是自己的wonum,子节点的路径是父节点路径加上自己的wonum,排序时数据库会按照这个字符串的顺序排列,自然就实现了父节点在前,所有子节点紧跟的效果。

方案2:针对不支持递归CTE的旧版数据库(如MySQL 5.x)

如果你的数据库版本比较老,不支持递归语法,可以用UNION ALL结合排序的方式来实现(适合最多两层的树形结构,也就是只有父节点和子节点的情况):

-- 先取出所有根节点
SELECT wonum, parent, woid
FROM t7
WHERE parent IS NULL

UNION ALL

-- 再取出所有子节点,关联对应的父节点
SELECT t.wonum, t.parent, t.woid
FROM t7 t
JOIN t7 parent_t ON t.parent = parent_t.wonum

-- 通过排序规则让父节点和子节点归为一组,父节点在前
ORDER BY 
    -- 按父节点ID分组(根节点用自己的wonum当分组标识)
    COALESCE(t.parent, t.wonum),
    -- 根节点优先级高于子节点
    CASE WHEN parent IS NULL THEN 0 ELSE 1 END,
    wonum;

注意事项

你给出的示例结果里部分woid值和插入的数据不一致(比如1034的woid是197、1036的woid是143等),这应该是输入笔误,上面的查询会基于表中实际存储的woid值输出结果。

内容的提问来源于stack exchange,提问作者RAJASEKHARA REDDY MARAM

火山引擎 最新活动