2010-01-25 17 views
4

J'ai une table qui contient une hiérarchie d'entreprise. Il a été décidé d'utiliser cette table car il n'y a pas de nombre défini de niveaux dans l'entreprise. La table fonctionne très bien, et si vous deviez utiliser des listes en cascade sur un client, c'est parfait. Cependant, j'ai besoin de voir une "section", et toutes les autres "sections" qui lui appartiennent. J'espère que les informations ci-dessous vous donneront une idée de ce que je dois être capable de faire.Oracle Hierarchical Query

Tableau Def

create table SECTION 
(
    SECTION_ID  NUMBER(38) not null, 
    SECTION_NAME  VARCHAR2(75) not null, 
    SECTION_MANAGER NUMBER(6) not null, 
    SECTION_LEVEL NUMBER(3) not null, 
    OWNER_SECTION_ID NUMBER(38) 
) 

données

1 IT     901763 2 0 
2 Business Systems    904241 3 1 
3 Business Analysis   900813 4 2 
4 Development   900976 4 2 
5 Testing     907052 4 2 
6 Systems Architecture 908012 4 2 
7 Mobilisation    904241 4 2 
8 Operations   900885 2 0 
9 Area 2     900456 3 8 
0 Executive       1 0 0 

Ce que je dois voir

0 Executive       1 8 Operations 
0 Executive       1 1 IT 
0 Executive       1 0 Executive 
0 Executive       1 2 Business Systems 
0 Executive       1 7 Mobilisation 
0 Executive       1 6 Systems Architecture 
0 Executive       1 4 Development 
0 Executive       1 3 Business Analysis 
0 Executive       1 5 Testing 
0 Executive       1 9 Area 2 
1 IT     901763 2 Business Systems 
1 IT     901763 7 Mobilisation 
1 IT     901763 6 Systems Architecture 
1 IT     901763 4 Development 
1 IT     901763 3 Business Analysis 
1 IT     901763 5 Testing 
2 Business Systems    904241 7 Mobilisation 
2 Business Systems    904241 6 Systems Architecture 
2 Business Systems    904241 4 Development 
2 Business Systems    904241 3 Business Analysis 
2 Business Systems    904241 5 Testing 
8 Operations   900885 9 Area 2 
7 Mobilisation    904241  
6 Systems Architecture 908012  
4 Development   900976  
3 Business Analysis   900813  
5 Testing     907052   
9 Area 2     900456 

que je pouvais le faire dans e e C# du côté client, mais j'aimerais vraiment l'avoir comme vue sur la base de données.

Quelqu'un peut-il s'il vous plaît aidez-moi avec ceci. Est-ce même possible?

Si vous avez besoin de quelque chose de clarifié, s'il vous plaît laissez un commentaire et je vais essayer de vous fournir plus d'informations.

Répondre

3

Cette solution produit un résultat qui ressemble à celui de la spécification du problème.

select 
    connect_by_root section_id section_id, 
    connect_by_root section_name section_name, 
    connect_by_root section_manager section_manager, 
    section_id subsection_id, 
    section_name subsection_name 
from 
    section 
connect by nocycle 
    prior section_id = owner_section_id 

La solution demandée génère 28 lignes lorsqu'elle est exécutée par rapport aux données d'exemple.

Notez que dans le résultat de l'échantillon, Executive apparaît comme une sous-section d'elle-même, alors que IT, Business Systems et Operations (qui, comme Executive, ont d'autres sous-sections aussi) ne le font pas. Cette solution produit les 3 rangées supplémentaires. En outre, notez que Executive est son propre propriétaire. Je suis d'avis que les cycles ne devraient pas être permises dans un graphique à moins que les maux auxquels ils nous exposent soient la façon la plus raisonnable d'obtenir certaines fonctionnalités requises. S'il n'y avait pas un tel cycle dans le graphique, le mot-clé nocycle dans la requête devrait être éliminé.

+0

C'est super, merci Un de nos DBA a trouvé une réponse mais c'était beaucoup plus compliqué que celui-là et ça Très efficace, je vais donc essayer demain et comparer les plans d'explication. – Dave7896

1

Oui, c'est possible. Vous devez utiliser la syntaxe Oracle CONNECT BY. Refer here. Désolé de ne pas partager le SQL car je ne peux pas le vérifier moi-même.

+0

Merci. Je "joue" avec connect by à la minute, mais je n'obtiens pas très loin :-( – Dave7896