Oracle SQL - 加入层次结构中的顶级记录

时间:2015-05-27 09:33:45

标签: sql oracle

我有一个名为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魔法很容易,但我认为我无法使用它。

任何提示将不胜感激。感谢

1 个答案:

答案 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

SQLFiddle

其次,我首先建立完整的层次结构树,然后对表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

SQLFiddle

两个查询都为测试数据生成相同的输出,第二个我假设对于“top cases”,parent_case为null。 第一个查询应该更快,因为它只为我们感兴趣的项目构建层次结构分支。