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

Langage SQL Discussion :

Comment rattacher toutes les feuilles d'un arbre à un level (Common Table Expression)


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 572
    Points : 341
    Points
    341
    Par défaut Comment rattacher toutes les feuilles d'un arbre à un level (Common Table Expression)
    Bonjour,

    J'ai une table qui représente un arbre au travers de 4 colonnes PID ID Nom Niveau (elle résulte d'une CTE). J'essaie de construire une requête qui à partir d'un niveau donné, rattacherai toutes les feuilles à ce niveau (cf image jointe).

    Quelqu'un sait-il comment faire ça ?

    a+, =)
    -=Clement=-

    PS : La CTE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH Arbre AS
    (
    SELECT PID,ID,Nom,0 AS Niveau
    FROM TableSource
    UNION ALL
    SELECT e.PID,e.ID,e.Nom,d.Niveau + 1 AS Expr1
    FROM TableSource AS e
    INNER JOIN Arbre AS d ON e.PID = d.ID
    )
    select * from Arbre
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Brutalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH Arbre AS
    (
    SELECT PID,ID,Nom,0 AS Niveau
    FROM TableSource
    UNION ALL
    SELECT e.PID,e.ID,e.Nom
     , CASE WHEN d.Niveau <= 1 THEN d.Niveau + 1 ELSE d.Niveau END AS Niveau
    FROM TableSource AS e
    INNER JOIN Arbre AS d ON e.PID = d.ID
    )
    select * from Arbre
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 572
    Points : 341
    Points
    341
    Par défaut
    Merci, en effet ce n'est pas assez subtil pour mon besoin. Avec ta requête les PID restent inchangés, la construction de l'arbre reste identique seulement les niveaux sont ramassés. voir l'image pour comprendre que ce n'est qu'une partie de ce que je recherche

    a+, =)
    -=Clement=-
    Images attachées Images attachées  

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    On étend le principe...
    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
    18
    19
    WITH Arbre AS
        (   SELECT  pid
                ,   id
                ,   nom
                ,   0 AS niveau
            FROM    tablesource
        UNION ALL
            SELECT  CASE WHEN d.niveau <= 2 THEN e.pid ELSE d.pid END AS pid
                ,   e.id
                ,   e.nom
                ,   CASE WHEN d.niveau <= 1 THEN d.niveau + 1 ELSE d.niveau END AS niveau
            FROM    tablesource AS e
                INNER JOIN 
                    arbre AS d 
                    ON  e.pid = d.id
        )
    SELECT  * 
    FROM    arbre
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 572
    Points : 341
    Points
    341
    Par défaut
    Hum, le PID reste inchangé, sauf erreur de ma part.

    edit :

    Je viens de trouver l' "erreur" : il faut que les deux CASE soient sur le même niveau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN d.Niveau <= 1
    Merci beaucoup pour ton aide.

    a+, =)
    -=Clement=-

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/10/2014, 23h49
  2. Réponses: 4
    Dernier message: 04/03/2014, 11h58
  3. Réponses: 1
    Dernier message: 07/06/2010, 18h05
  4. Prendre toutes les feuilles d'un arbre
    Par buenol dans le forum Langage
    Réponses: 1
    Dernier message: 17/12/2009, 09h46
  5. Comment parcourir toutes les feuilles d'un classeur excel?
    Par Subkill dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/02/2007, 20h47

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