我有一个问题,我认为只能通过 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 为 null,第一个项目不存在 task_item)。
我的问题:
给定一个task_id 我想提取所有前面的任务。
这个问题与 Philip Greenspun 对 Oracle 中的树的精彩介绍 或 Wikibook 的分层查询描述 中描述的问题接壤,但当这些问题包含更多 ID 和 时,似乎找不到任何好的解决方案来解决这些问题一个连接表。
我自己的 SQL-foo 严重不足,我用谷歌搜索了我的心,但没有找到解决我的特定问题的方法。
Carrie Fisher 的声音:帮助我 Stack Overflow,你是我唯一的希望。
我自己没能看到的技巧是首先将所需的信息连接在一起,然后执行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 byprior 构建层次结构。最外层的 SQL 根据应用程序的要求连接其余数据。