我有一个名为Case
的表,其中有一个属性parent_case
,可以创建一个案例层次结构。
我正在提取一份与案件有关联的任务清单。但是,案例可以处于层次结构中的任何级别。我需要加入顶级案例,因为顶级案例与我需要加入的用户表有关联。 (基本上我想要与'原始'案例相关的人的姓名)
我做的是这样的事情:
SELECT id FROM (
SELECT id
FROM CASES
START WITH id = <<key_of_case_from_task_here>>
CONNECT BY NOCYCLE PRIOR parent_case = id
ORDER BY datecreated ASC
) WHERE ROWNUM = 1
这构建了一个表,其中每一行都是从id
I供应开始的层次结构中的一个案例(在完整查询中,它将是任务上的外键,表示它的相关情况)。然后按datecreated
排序,将我最顶层的案例置于顶部(父项始终首先创建),然后抓取第一个案例。
我希望通过将<key_of_case_from_task_here>
替换为task.associated_case
来加入JOIN,但似乎Oracle不允许您在JOIN中使用父查询中的列。
所以现在我完全难过了。这可能吗?我确信有一些PL / SQL魔法很容易,但我认为我无法使用它。
任何提示将不胜感激。感谢
答案 0 :(得分:0)
两种可能的解决方案,首先从结束开始,我们找到叶子,在这些情况下是“原始案例”:
with
t as (select task_id, case_id from task),
h as (select id, connect_by_root(id) root, connect_by_isleaf leaf
from cases start with id in (select case_id from t)
connect by prior parent_case = id)
select t.task_id, t.case_id, h.id top_case
from t join h on t.case_id = h.root where leaf=1
其次,我首先建立完整的层次结构树,然后对表tasks
中的每个case_id进行补充我正在寻找合适的
层次结构中的大小写并显示它的根。
with hierarchy as (
select id, connect_by_root(id) root from cases
start with parent_case is null
connect by parent_case = prior id)
select task.task_id, task.case_id, h.root top_case
from task join hierarchy h on task.case_id = h.id
两个查询都为测试数据生成相同的输出,第二个我假设对于“top cases”,parent_case为null。 第一个查询应该更快,因为它只为我们感兴趣的项目构建层次结构分支。