IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Oracle
Calcul des valeurs des noeuds d'un arbre

Le , par islamov2000

0PARTAGES

J'ai développé une procédure qui calcule valeurs des nœuds d'un arbre donné.
La procédure base sur l'idée de récursivité, c’est vraiment un casse tête pour l’implémenter.
Donc, j'ai pensé à modéliser mon idée sous un SQL/Oracle en mettant la requête générique valable pour n'importe quel arbre .
L'arbre doit être introduit dans une table. cette dernière comporte 03 champs: pere, fils et valeur.

Les nœuds sont présentés comme suite dans la table:
Pere Fils Valeur
A B null


Les feuilles sont présentés comme suite dans la table:
Pere Fils Valeur
B null 3


REQUETE:
Code : Sélectionner tout
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
30
31
32
33
34
35
36
37
38
39
with tab as 
( 
 select 'A' pere, 'B' fils, null valeur from dual union
 select 'A', 'C', null from dual union
select 'B', 'D', null from dual union
select 'B', 'E', null from dual union
select 'D', 'H', null from dual union
select 'E', 'I', null from dual union
select 'E', 'J', null from dual union
select 'J', null, 8 from dual union
select 'I', null, 15 from dual union
select 'H', null, 32 from dual union
select 'C', 'F', null from dual union
select 'F', null, 7 from dual union
select 'C', 'G', null from dual union
select 'G', 'K', null from dual union
select 'G', 'L', null from dual union
select 'L', 'M', null from dual union
select 'K', null, 2 from dual union
select 'M', null, 22 from dual 
)

select distinct D.* from 
(
      select noeud,sum(valeur)over(partition by noeud),chemin , arbre  from
      (
            select distinct regexp_substr(B.chemin,'[^(#)]+',1,level) noeud,valeur,B.chemin ,arbre from
            (
                    select t.valeur ,level niveau ,sys_connect_by_path(pere,'#') chemin,LPAD('-', 5*(level), '-')||pere  arbre
                    from tab t
                    start with pere ='A'--RACINE
                    connect by   prior fils=pere
            )B
            connect by level <=length(B.chemin)/2
      )C
      where noeud is not null 
)D
where noeud=substr(chemin,length(chemin))
order by chemin
Schéma du l'arbre:

Une erreur dans cette actualité ? Signalez-nous-la !