2013-02-21 3 views
0

У меня проблема, которая, по моему мнению, разрешима только с помощью инструкции Connect-to-before.Oracle - таблицы соединений и подключение к предыдущему

Моя модель данных, упрощается, следующим образом:

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's excellent introduction to trees in Oracle, или в Wikibook's description of Hierarchical Queries, но не может найти хорошие решения для решения этих проблем, когда они включают в себя больше идентификаторов и таблицу Junction.

Мое собственное SQL-foo, к сожалению, коротко, и я искал свое сердце, не найдя решения для моей конкретной проблемы.

В голосе Кэрри Фишер: Помогите мне переполнить стек, вы - моя единственная надежда.

+5

Не могли бы вы включить несколько строк данных? [похоже, что некоторая информация может быть избыточной в вашей модели] –

+1

Не следует ли «набор элементов объединяться в задачу», а читать «набор элементов задачи объединяется в задачу»? –

+1

@phareim: Ваша проблема в '' Учитывая одно task_id, я хочу извлечь все предыдущие задачи. "', То зачем нам нужна таблица 'TASK_ITEM AND TASK' Его легко найти только с помощью одной таблицы? –

ответ

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 создает правильную родительскую таблицу. Следующее построение иерархии с использованием подключиться к предыдущему. Самый внешний SQL присоединяется к остальным данным, как требуется в приложении.

Благодарим вас за внимание и отзыв.