通过SQL查询或函数获取依赖对象列表

时间:2019-04-06 07:08:12

标签: sql oracle hierarchical-data

我有两个桌子。一个用于任务,第二个用于任务的依赖表。 我希望查询根据特定的ID(递归地)给我所有任务。

我有两个桌子。一个用于任务

ID  TASK  
1   Abc  
2   Def  
3   Ghi  
4   Jkl  
5   Mno  
6   Pqr 

第二个是获取依赖任务

ID  DEPENDENT_ON  
2   1  
3   1  
4   2  
4   6  
5   2  
6   5  

是否可以编写sql查询以获取依赖于特定任务的所有任务(递归)的列表。

示例。
我想检查所有依赖于ID = 1的任务。 预期输出(分别为2和3):

2.Def
3.Ghi 

此外,查询还应提供这两个相关任务的输出,依此类推。 最终输出应为:

2.Def -- level one
3.Ghi -- level one 
4.Jkl -- Dependent on task 2  
5.Mno -- Dependent on task 2 
6.Pqr -- Dependent on task 5

格式化并不重要。仅输出是必需的

1 个答案:

答案 0 :(得分:0)

  

我需要联接两个表,然后进行递归搜索。

您必须通过DEPENDENT_ON外部联接第二个表(您没有命名,所以我称它为TASK_TREE)到父ID。外部联接,因为任务1是树的顶部,并且不依赖任何任务。然后使用Oracle的分层查询语法遍历树:

select t.id, t.task, tt.dependent_on, level
from tasks t
     left outer join task_tree tt on tt.id = t.id
connect by prior t.id = tt.dependent_on 
start with t.id = 1
/

我包括了level,因此您可以看到树如何展开。 Oracle SQL文档详细介绍了层次结构查询。 Find out more。如果您不想使用Oracle专有的分层语法,请从11gR2开始使用Oracle支持的递归WITH子句。 Find out more

偶然地,您发布的数据包含错误。任务4同时依赖于2和6。层次结构必须具有依赖于单个父节点的子节点。否则,您会得到各种各样的奇怪结果。