任务关系表rel,任务是id,后续任务是next_id,在Oracle,写一个递归查询,得到每一个任务最终的后置任务,字段清单包括:任务、后置任务、最终后置任务
时间: 2023-09-11 11:05:47 浏览: 113
可以使用`CONNECT BY`子句来实现递归查询,以下是一个示例SQL语句:
```
SELECT id AS 任务, next_id AS 后置任务, CONNECT_BY_ROOT next_id AS 最终后置任务
FROM rel
CONNECT BY NOCYCLE PRIOR next_id = id
START WITH id NOT IN (SELECT next_id FROM rel)
ORDER SIBLINGS BY id;
```
解释一下这个语句:
1. `CONNECT_BY`子句用于指定递归查询的条件,`PRIOR`关键字表示取得上一级的值,`NOCYCLE`表示不允许出现环形查询。
2. `START WITH`子句用于指定起始条件,这里表示选择没有被其它任务依赖的任务作为起始节点。
3. `ORDER SIBLINGS BY`用于指定排序方式,这里按照任务ID进行排序。
4. `CONNECT_BY_ROOT`函数用于取得根节点的值,这里用于取得每个任务的最终后置任务。
希望对你有所帮助!
相关问题
任务关系表rel,任务字段是id,后置任务字段是next_id,在Oracle,写一个递归查询,得到每一个任务最终的后置任务
可以使用Oracle的`CONNECT BY`语句来进行递归查询,具体的查询语句如下:
```sql
SELECT id, next_id, CONNECT_BY_ROOT next_id AS final_next_id
FROM rel
START WITH next_id IS NULL
CONNECT BY PRIOR id = next_id;
```
解释一下上面的查询语句:
1. `START WITH next_id IS NULL`:从`next_id`为空的记录开始进行递归查询。
2. `CONNECT BY PRIOR id = next_id`:根据每个记录的`id`与`next_id`字段进行连接,形成树状结构。
3. `CONNECT_BY_ROOT next_id AS final_next_id`:使用`CONNECT_BY_ROOT`函数获取每个节点所在子树的根节点的`next_id`值,并且将其作为该节点的最终后置任务`final_next_id`。
这样,可以得到每个任务最终的后置任务的查询结果。
表rel表是树状结构,id是节点,next_id是子节点,写一个Oracle递归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。
阅读全文