如何在Presto层级表中查询所有记录的根节点?
在Presto中查询树形结构的根节点
这是个很常见的树形结构遍历需求,Presto支持递归CTE(Common Table Expression),完全可以搞定这个向上查找根节点的问题。假设你的表名为tree_nodes,我来给你一步步拆解解决方案:
核心思路
利用递归CTE的特性,分成两部分处理:
- 锚点成员:先筛选出所有根节点(
ParentId IS NULL的节点),它们的根就是NULL,完全匹配你的输出要求。 - 递归成员:不断将子节点与父节点关联,子节点的根节点直接继承父节点的ID——如果父节点已经找到根,那这个ID就是最终的根节点。
完整SQL代码
WITH RECURSIVE node_roots AS ( -- 锚点:根节点的Root为NULL SELECT ID, ParentId, NULL AS Root FROM tree_nodes WHERE ParentId IS NULL UNION ALL -- 递归:子节点关联父节点,Root取父节点的ID SELECT tn.ID, tn.ParentId, nr.ID AS Root FROM tree_nodes tn JOIN node_roots nr ON tn.ParentId = nr.ID ) SELECT ID, Root FROM node_roots ORDER BY ID;
验证结果
把你的测试数据代入这个查询,得到的结果完全符合你的预期:
| ID | Root |
|---|---|
| 1 | NULL |
| 2 | 1 |
| 3 | 7 |
| 4 | 1 |
| 5 | 7 |
| 6 | 7 |
| 7 | NULL |
补充说明
- 如果你的表名不是
tree_nodes,记得替换成实际表名。 - 递归CTE在Presto中默认递归深度是1000层,如果你的树形结构更深,可以通过调整配置参数
query.max-recursion-depth来修改限制。
内容的提问来源于stack exchange,提问作者HaloKu
相关产品推荐
相关产品推荐

