表rel表是树状结构,id是节点,next_id是子节点,写一个Oracle递归SQL,得到对应的最远的叶子节点
时间: 2023-09-11 12:06:48 浏览: 118
SQL 双亲节点查找所有子节点的实现方法
假表名为rel,可以使用以下Oracle递归SQL来得到最远的叶子节点:
```
WITH RECURSIVE cte (id, next_id, leaf) AS (
SELECT id, next_id, next_id
FROM rel
WHERE next_id IS NOT NULL
UNION ALL
SELECT cte.id, rel.next_id, rel.next_id
FROM cte
JOIN rel ON cte.next_id = rel.id
WHERE rel.next_id IS NOT NULL
)
SELECT id, leaf
FROM cte
WHERE leaf NOT IN (SELECT id FROM rel)
```
这个递归SQL首先选取所有有子节点的节点(即next_id不为NULL的节点),将它们的id和next_id作为起始节点,并假设它们的最远叶子节点为next_id。然后,递归地遍历每个节点的子节点,将它们的id和next_id加入递归结果集,并更新它们的最远叶子节点为子节点的最远叶子节点。最终,筛选出所有叶子节点(即next_id为NULL的节点),输出它们的id和最远叶子节点leaf。
阅读全文