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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Une autre représentation d'arbre


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Par défaut Une autre représentation d'arbre
    Bonjour à tous.

    J'ai une base oracle qui gère des Projets, découpés en Phase puis Activités et Taches. (particularité, les Taches peuvent être à tous les niveaux sauf la racine).

    En gros :
    Projet
    ++++ Phase 1
    ++++++++ Activité 1
    ++++++++++++ Tache 1
    ++++++++ Activité 2
    ++++++++++++ Tache 2
    ++++ Phase 2
    ++++++++ Tache 3
    ++++++++ Activité 3
    ++++++++++++ Tache 4

    malheureusement pour moi ceci est représenté ainsi dans la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TASK ( 
        ID           NUMBER(10,0) NULL,
        NOM          VARCHAR2(450) NULL,
        NIVEAU       NUMBER(5,0) NULL,
        SEQUENCE     NUMBER(5,0) NULL,
        EST_TACHE    NUMBER(10,0) DEFAULT 0 NOT NULL
        );
    soit, pour mon exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID ID_PROJET NOM        NIVEAU SEQUENCE EST_TACHE
    1  1         Phase 1      1         1        0
    2  1         Activité 1   2         2        0
    3  1         Tache 1      3         3        1
    4  1         Activité 2   2         4        0
    5  1         Tache 2      3         5        1
    6  1         Phase 2      1         6        0
    7  1         Tache 3      2         7        1
    8  1         Activité 3   2         8        0
    9  1         Tache 4      3        9        1
    La hiérarchie est donc représentée par les 2 colonnes NIVEAU et SEQUENCE qui représente la profondeur et "l'ordre" des feuilles.

    Ma question (on y arrive) est la suivante.
    Quelle est la meilleure facon de représenter mes données sous la forme suivante
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID_PROJET ID_PHASE ID_ACTIVITE ID_TACHE NOM
    1         1        NULL        NULL     Phase 1
    1         1        2           NULL     Activité 1
    1         1        2           3        Tache 1
    1         1        4           NULL     Activité 2
    1         1        4           5        Tache 2
    1         6        NULL        NULL     Phase 2
    1         6        NULL        7        Tache 3
    1         6        8           NULL     Activité 3
    1         6        8           9       Tache 4
    Je suis sous Oracle 10.2
    C'est chaud non ?

    je l'ai fait mais c'est horrible...
    des UNION + des SELECT MAX(ID) KEEP (dense_rank LAST ORDER BY NIVEAU), etc...

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ce que tu cherches à faire est de la cosmétique et n'est pas le boulot du SGBD mais celui du logiciel qui présente les données à l'utilisateur.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ce que tu cherches à faire est de la cosmétique et n'est pas le boulot du SGBD mais celui du logiciel qui présente les données à l'utilisateur.
    Certes mais de nombreux reportings vont vouloir cette présentation.
    Afin de ne pas devoir refaire cette "conversion de forme" à chaque fois, j'essaie de déporter cela dans une vue qui s'appuierait sur mes tables ce qui sera plus "lisible" pour les développeurs

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut,

    Cinephile, tu trouves que savoir à quelle activité est rattaché une tâche, a quelle phase est rattachée une activité c'est cosmétique ?

    Pas moi.

    Par contre, la modélisation est douteuse... je vais essayer de sortir la requête, ça a l'air drôle

    [EDIT] Tiens, l'activité 3 ne devrait-elle pas être de niveau 3 et la tâche 4 de niveau 2 ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Vu la modélisation .....

    Moi j'ai fait ca :
    ca marche avec l'exemple mais faudrai un truc un peu plus complexe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    with recursive tmp(id_projet, id_phase, id_activite, id_tache , nom, act_seq) as (
    select id_projet, seq, cast(null as integer), cast(null as integer), nom, seq  
    from task
    where seq = 1
    union all
    select a.id_projet, 
    case when b.niveau = 1 then b.seq else a.id_phase end,
    case when b.niveau = 2 then b.seq else case when b.niveau = 1 then null else a.id_activite end end, 
    case when b.niveau = 3 then b.seq else null end,
    b.nom,
    b.seq
    from tmp a
    inner join task b on a.id_projet = b.id_projet and a.act_seq + 1 = b.seq)
     
     
    select * from tmp
    Dans mon code "seq" c'est la colonne sequence.
    J'ai aussi changé l'id 7 de votre exemple vu que c'est une tache et qu'il a le niveau 2 au lieu de 3 (je suppose, m'enfin si ça n'est pas le cas il faudra juste faire un test sur "est_tache" au lieu de niveau pour régler le problème.)

    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    1;1;;;"Phase 1";1
    1;1;2;;"Activité 1";2
    1;1;2;3;"Tache 1";3
    1;1;4;;"Activité 2";4
    1;1;4;5;"Tache 2";5
    1;6;;;"Phase 2";6
    1;6;;7;"Tache 3";7
    1;6;8;;"Activité 3";8
    1;6;8;9;"Tache 4";9

    edit :
    requete si le jeu de donné de départ est bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    with recursive tmp(id_projet, id_phase, id_activite, id_tache , nom, act_seq) as (
    select id_projet, seq, cast(null as integer), cast(null as integer), nom, seq  
    from task
    where seq = 1
    union all
    select a.id_projet, 
    case when b.niveau = 1 then b.seq else a.id_phase end,
    case when (b.niveau = 2 and b.est_tache = 0) then b.seq else case when b.niveau = 1 then null else a.id_activite end end, 
    case when b.est_tache = 1 then b.seq else null end,
    b.nom,
    b.seq
    from tmp a
    inner join task b on a.id_projet = b.id_projet and a.act_seq + 1 = b.seq)
     
     
    select * from tmp

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Punkoff, recursive with, c'est pas avant 11g (R2 ?)



    [EDIT]
    Je me suis vautré, je vais corriger ma requête

Discussions similaires

  1. Réponses: 15
    Dernier message: 08/08/2012, 17h35
  2. [XSD] Binding et XSD associée à une classe Java "représentant un arbre"
    Par A.You dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 23/04/2012, 14h53
  3. Select sur une représentation en arbre
    Par ctxctx dans le forum Langage SQL
    Réponses: 17
    Dernier message: 29/11/2011, 15h45
  4. Représenter un arbre dans une console
    Par rambc dans le forum Général Python
    Réponses: 9
    Dernier message: 31/10/2010, 23h55
  5. Modifier un attribut représentant une autre classe
    Par piotrr dans le forum Hibernate
    Réponses: 6
    Dernier message: 13/05/2008, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo