Oracle - 连接表并连接到之前的

时间:2013-02-21 11:58:23

标签: oracle hierarchical-data connect-by

我遇到的问题是我认为只能通过Connect-to-prior语句解决。

我的数据模型简化如下:

create table TASK
 ( TASK_ID number
);
create table ITEM
 ( TASK_ID number,
   NEXT_TASK_ID number
);    
create table TASK_ITEM
 ( TASK_ID number,
   ITEM_ID number
);

将一组项目合并为一项任务。任务集合组合成一个或多个项目(这是TASK_ITEM联结表的来源)。该过程以一组项开始,以一个项结束(对于最后一项,ITEM.NEXT_TASK_ID为空,并且第一项不存在task_item)。

我的问题:

鉴于一个task_id 我想提取所有前面的任务

这是一个与Philip Greenspun's excellent introduction to trees in OracleWikibook's description of Hierarchical Queries中描述的问题接近的问题,但是当它们包含更多ID和Junction表时,似乎无法找到解决这些问题的任何好解决方案。

我自己的SQL-foo遗憾地缩短了,而且我在没有找到解决我特定问题的方法的情况下搜索了我的心脏。

在Carrie Fisher的声音中:帮助我Stack Overflow,你是我唯一的希望。

1 个答案:

答案 0 :(得分:0)

寻求,你会发现。

在同事的帮助下,我们对此进行了整理。

我自己没有想到的诀窍是首先将所需信息加入,然后然后执行连接到 -statement。

我认为下面的代码解决了所描述的问题。

select parent_task.* 
    from (
    select  parent_task_id, item_id, task_id, level
        from (
            select 
                task.task_id parent_task_id, 
                task_item.item_id, 
                item.task_id task_id
            from 
                task, task_item, item
            where 
                task_item.task_id = task.task_id
            and 
                item.item_id = task_item.item_id) properly_structured_parent_table    
        start with task_id = :TASK_ID
        connect by prior parent_task_id = task_id 
    ) task_hierarchy, task parent_task
where parent_task.task_id = task_hierarchy.task_id;

内部的SQL构建了一个合适的parent_table。下一步使用 connect by prior 构建层次结构。最外层的SQL根据应用程序的需要加入其余数据。

感谢您的时间和反馈。