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 15/02/2007, 16h43   #1
Nouveau Membre du Club
 
Avatar de magic charly
 
Inscription : février 2006
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 167
Points : 35
Points : 35
Bonjour,

Je ressors le sujet ...
Bravo laurent pour ton explication.
je serai intéressé par le même genre de problématique mais cette fois ci en 10g. Saurais tu m'expliquer en quoi la solution est simplifiée en 10g ?


Merci d'avance.

Magic Charly
magic charly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 16h58   #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
au lieu de faire un substr et un connect_by_path, tu fais juste un connect_by_root
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 17h44   #3
Nouveau Membre du Club
 
Avatar de magic charly
 
Inscription : février 2006
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 167
Points : 35
Points : 35
Par défaut Construction d'un arbre en Oracle 10i

Bonjour,

Je souhaiterais construire un select "intelligent" qui me retourne les records dans un ordre hierarchique.

exemple

A
-B
--E
---H
---I
--F
-C
--G
-D



J'ai une table de la forme


ID - ID_RACINE - ID_PERE - LEVEL

A - A - A - 1

B - A - A - 2

C - A - A - 2

D - A - A - 2

E - A - B - 3

F - A - B - 3

G - A - C - 3

H - A - E - 4

I - A - E - 4

J'essaie d'obtenir en retour mes enregistrements dans l'ordre

A
B
E
H
I
F
C
G
D

Sachant que l'ordre dans lequel est traité les branches n'a aucune importance. Je m'explique le résultat précédent a la même valeur pour moi que :

A
C
G
D
B
F
E
I
H

J'ai regardé beaucoup de choses sur la gestion d'arborescence mais je pense que ce que je veux faire peut probablement se faire simplement.
Auriez-vous déjà été confrontés a ce genre de cas.

Merci de votre aide
magic charly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 18h03   #4
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
les connect by prior son tes amis
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 09h48   #5
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
ce qui est étrange dans ta table c'est ta ligne a-a (comment peut-on être son propre fils)

Si on supprime ta ligne <A;A>, alors

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
 
SQL> DELETE arbre WHERE pere=fils;
 
1 row deleted.
 
SQL> SELECT connect_by_root pere parent,fils, level FROM arbre connect BY pere=prior fils;
 
P F      LEVEL
- - ----------
A B          1
A D          2
A H          3
A I          3
A E          2
A C          1
A F          2
A G          2
B D          1
B H          2
B I          2
B E          1
C F          1
C G          1
D H          1
D I          1
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 09h51   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par laurentschneider
ce qui est étrange dans ta table c'est ta ligne a-a (comment peut-on être son propre fils)
Pour identifier un père c'est peut-être plus performant de chercher le père qui est fils que le père qui a au moins un fils
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 09h53   #7
Nouveau Membre du Club
 
Avatar de magic charly
 
Inscription : février 2006
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 167
Points : 35
Points : 35
Code :
1
2
3
4
5
6
 
 
SELECT *
FROM ma_table
START WITH ID=ID_RACINE
CONNECT BY PRIOR ID=ID_PERE
cela fonctionne... cependant une difficulté supplémentaire (et pas des moindres) a mon problème. Certains éléments de mon arborescence ne sont pas rattachés père à père jusqu'a la racine et je souhaiterais les ramener quand même via mon SELECT (et de façon hiérarchisée).

ex :


ID - ID_RACINE - ID_PERE - LEVEL

A - A - A - 1

B - A - A - 2

C - A - A - 2

D - A - A - 2

E - A - B - 3

F - A - B - 3

G - A - C - 3

H - A - E - 4

I - A - E - 4

J - A - W - 4

K - A - J - 5

L - A - J - 5



Je pensais à une requête recursive qui selectionnerait l'élément non trié de l'arborescence de niveau le plus faible (+ proche de la racine) et lancer la requête précédente avec

Code :
1
2
3
4
5
6
 
 
SELECT *
FROM ma_table
START WITH ID=ID_BAS_NIV
CONNECT BY PRIOR ID=ID_PERE
remarque : le premier élément sera donc ID_RACINE

marquer les enregistrements renvoyés par cette nouvelle opération pour indiquer qu'ils sont "triés"

et réitérer le process jusqu'à ce qu'il n'y ait plus d'éléments non marqués

L'idée me parait en théorie pas mauvaise mais ... disons que je ne sais pas trop si en PL/ SQL c'est possible et surtout sur quelles pistes partir pour mettre en oeuvre cette requête recursive.

Votre aide me sera tres précieuse

Magic CHarly
magic charly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2007, 09h56   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
petit ménage fait par mes soins pour rassembler les posts
orafrance 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 04h05.


 
 
 
 
Partenaires

Hébergement Web