DB2中如何通过SELECT查询同一张表的父子层级数据?
查询同一张表的父子层级数据
嘿,要搞定这个父子层级数据的输出需求其实不难,关键是利用数据库的树形遍历能力,下面我会针对不同数据库版本给出具体的实现方案:
方案1:使用递归CTE(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)
如果你的数据库支持WITH RECURSIVE(递归公共表表达式),这是处理树形结构最灵活的方式。我们可以先抓取所有根节点(parent为null的记录),然后递归遍历它们的子节点,同时生成一个排序路径来保证父节点在前、子节点紧随其后的顺序:
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




