2013-02-21 2 views
0

J'ai un problème que je pense ne peut être résolue avec une déclaration Connect-to-prior.Oracle - tables de jonction et se connecter à avant

Mon modèle de données est simplifiée comme suit:

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 
); 

un ensemble d'éléments sont combinés en une tâche. Un ensemble de tâches est combiné en un ou plusieurs éléments (c'est ici que la table de jonction TASK_ITEM entre). Le processus commence par un ensemble d'éléments et se termine par un seul élément (ITEM.NEXT_TASK_ID est nul pour le dernier élément et aucun attribut task_item n'existe pour les premiers éléments).

Mon problème:

Étant donné un task_id Je veux extraire toutes les tâches précédentes.

Ce problème est en bordure de ceux décrits dans Philip Greenspun's excellent introduction to trees in Oracle, ou Wikibook's description of Hierarchical Queries, mais ne peut pas sembler trouver de bonnes solutions résoudre ces problèmes quand ils comprennent plus d'ID et une table de jonction.

Mon propre SQL-foo tombe très court, et j'ai googlé mon cœur sans trouver une solution à mon problème particulier. De la voix de Carrie Fisher: Aidez-moi Stack Overflow, vous êtes mon seul espoir.

+5

Pourriez-vous inclure quelques lignes de données? [il semble que certaines informations peuvent être redondantes dans votre modèle] –

+1

Un ensemble d'éléments ne doit-il pas être combiné dans une tâche plutôt que de lire "un ensemble d'éléments de tâche est combiné dans une tâche"? –

+1

@phareim: Votre problème est "" Étant donné un task_id je veux extraire toutes les tâches précédentes. ", Alors pourquoi nous avons besoin de la table' TASK_ITEM AND TASK 'Il peut être facilement trouvé par Un seul élément de table ?? –

Répondre

0

Cherchez et vous trouverez.

Avec l'aide d'un collègue, nous avons réglé ce problème.

Le truc que je ne l'avais pas réussi à voir pour moi-même est d'abord rejoindre les informations requises ensemble, puis faire la se connecter à -Déclaration.

Je pense que le code ci-dessous résout le problème tel qu'il est décrit.

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; 

Le mot interne SQL crée une parent_table appropriée. Le prochain construire une hiérarchie en utilisant se connecter par avant. Le SQL le plus externe rejoint le reste des données, comme requis dans l'application.

Nous vous remercions de votre temps et vos commentaires.

Questions connexes