Récupération des branches d'un arbre

Récupération des branches d'un arbre - SQL/NoSQL - Programmation

Marsh Posté le 07-09-2007 à 14:20:10    

Bonjour,
J'ai une table dans laquelle est stockée la hiérarchie géographique de la façon suivante:
Table GEOGRAPHIE
------------------
Code Pere              Niveau Pere         Code Fils           Niveau Fils
1                                FR                  11                     REG
1                                FR                  12                     REG
11                              REG                 111                   DEP
11                              REG                 112                   DEP
12                              REG                 121                   DEP
111                            DEP                 1111                  VIL
111                            DEP                 1112                  VIL
112                            DEP                 1121                  VIL
121                            DEP                 1211                  VIL
121                            DEP                 1212                  VIL
121                            DEP                 1213                  VIL
 
sachant que les codes géographiques sont différents pour tous les éléments géographiques (par exemple 2 villes de 2 régions différentes ne peuvent avoir le même code tout comme une ville et une région ne peuvent avoir le même code)
 
On me passe un code géographique dont j'ignore le niveau (on peut aussi bien me passer la France qu'une région ou une ville) et il me faut récupérer tous ses ascendants et tous ses descendants mis en forme de la façon suivante:
Ex1 : on me passe le code 121
FR                         REG                   DEP                VIL
1                            12                    121                1211
1                            12                    121                1212
1                            12                    121                1213
 
Ex2 : on me passe le code 11
FR                         REG                   DEP                VIL
1                            11                    111                1111
1                            11                    111                1112
1                            11                    112                1121
 
Je travail en PL/SQL sur Oracle 10g.
 
Je sais qu'il existe une fonction connect by, mais je ne parvient pas à récuperer des branches entières, juste des segments de branche.
Pourriez-vous m'aider svp?

Reply

Marsh Posté le 07-09-2007 à 14:20:10   

Reply

Marsh Posté le 07-09-2007 à 14:31:34    

Ben tu prends une fourche et une brouette :spamafote:
 
Je vois pas ce qu'il te bloque avec connect by.
T'utilises bien la clause PRIOR au moins ?
 
Tu peux poster ta requête ?

Reply

Marsh Posté le 07-09-2007 à 14:42:37    

Ce qui me pose problème ce n'est pas de récupérer:
1
12
121
1211
1212
1213
Mais plutôt la mise en forme
 
Voici ma requête (probablement débile mais il y a 30 min je ne connaissais pas connect By et je ne suis pas persuadée de l'utiliser correctement)
 
SELECT DISTINCT Code_pere AS CODGEO, Niveau_pere AS NIV, LEVEL
FROM geographie
START WITH code_pere = :pGeo
CONNECT BY code_fils = PRIOR code_pere
UNION ALL  
SELECT DISTINCT code_fils AS CODGEO, Niveau_fils AS NIV, LEVEL
FROM geographie
START WITH code_pere = :pGeo
CONNECT BY PRIOR  code_fils = code_pere
 
 
Sinon merci pour les autres messages que tu as posté pour en aider d'autres, j'avoue qu'ils m'ont été également très utils

Reply

Marsh Posté le 07-09-2007 à 16:14:39    

Mais bien sur avec une auto jointure

Reply

Marsh Posté le 10-09-2007 à 11:58:49    

A priori, ta requête est bonne.
Je rajouterais quand même un champ "virtuel" histoire de savoir de quelle partir de l'union vient les résultats.
 
Qu'est-ce qui ne va pas ?
 
Oracle ne va de toute façon pouvoir te récupérer les données que sous forme de 2 colonnes pere/fils.
Ensuite c'est à toi de faire la mise en forme via ton langage de programmation (C, PHP, etc.)
 
Le connect by te permet surtout de récupérer l'arboressence, donc tu filtres les lignes que tu ne veux pas, et grace à l'indication "level", t'as directement une information de profondeur. Mais ça ne fait pas tout non plus ;)

Reply

Marsh Posté le 22-09-2007 à 19:01:03    

Utilise level que tu combines avec un rpad('..','..',level())
Ca te mettra deux points par niveau hiérarchique

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed