0

我有一个我认为只能通过 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 对 Oracle 中的树的出色介绍Wikibook 对 Hierarchical Queries 的描述中描述的问题接壤的问题,但是当它们包含更多 ID 和连接表时,似乎找不到任何好的解决方案来解决这些问题。

可悲的是,我自己的 SQL-foo 很短,我用谷歌搜索了我的心,但没有找到解决我特定问题的方法。

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

4

1 回答 1

0

寻找,你就会找到。

在同事的帮助下,我们解决了这个问题。

我自己没有设法看到的技巧是首先将所需的信息连接在一起,然后执行connect to语句。

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

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;

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

感谢您的时间和反馈的人。

于 2013-02-21T13:11:17.480 回答