Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2007, 15h35   #1
Invité régulier
 
Inscription : mai 2005
Messages : 20
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 20
Points : 6
Points : 6
Par défaut [Oracle 9i] Construction d'une requête hiérarchique

Bonjour,

Nous avons mis les éléments suivants dans la table ARBRE :

Code :
1
2
3
4
5
6
7
8
9
INSERT INTO ARBRE (pere, fils) VALUES ('A','A');
INSERT INTO ARBRE (pere, fils) VALUES ('A','B');
INSERT INTO ARBRE (pere, fils) VALUES ('B','D');
INSERT INTO ARBRE (pere, fils) VALUES ('D','H');
INSERT INTO ARBRE (pere, fils) VALUES ('D','I');
INSERT INTO ARBRE (pere, fils) VALUES ('B','E');
INSERT INTO ARBRE (pere, fils) VALUES ('A','C');
INSERT INTO ARBRE (pere, fils) VALUES ('C','F');
INSERT INTO ARBRE (pere, fils) VALUES ('C','G');

Nous souhaitons à partir d’une requête hiérarchique obtenir pour chaque nœuds la distance de tous ses ascendants directs.

Description de l’arbre :
A
..+__ B
........+__ D
..............+__ H
..............+__ I
........+__ E
..+__ C
........+__ F
........+__ G


Résultat à obtenir :

Parent | fils | distance
null | A | 0
A | B | 1
B | D | 1
D | H | 1
D | I | 1
B | E | 1
A | C | 1
C | F | 1
C | G | 1
A | D | 2
B | H | 2
B | I | 2
A | E | 2
A | F | 2
A | G | 2
A | H | 3
A | I | 3

Merci pour votre aide.
Adi81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 15h51   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
en 10g ça aurait été hyper simple avec connect_by_root. Bon. 9i.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
SELECT decode(pere,fils,NULL,substr(p,2,1)) parent, fils, distance
FROM (
  SELECT rownum, level-1 distance,pere,fils,sys_connect_by_path(fils,'+') p 
  FROM arbre connect BY nullif(pere,fils)=prior fils
)
WHERE pere=fils OR distance>0
ORDER BY distance,parent,fils
/
 
PARENT FILS DISTANCE
------ ---- --------
       A           0
A      B           1
A      C           1
B      D           1
B      E           1
C      F           1
C      G           1
D      H           1
D      I           1
A      D           2
A      E           2
A      F           2
A      G           2
B      H           2
B      I           2
A      H           3
A      I           3
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h27.


 
 
 
 
Partenaires

Hébergement Web