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 :

[SQL server 2005] Problème de tris avec notion Père-Fils


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [SQL server 2005] Problème de tris avec notion Père-Fils
    Bonjour à tous,

    J'ai les 2 tables suivantes:

    - "GENERATIONS" contenant (entre autres) 3 colonnes "GEN_ID", "GEN_LIBELLE" et "GEN_NUM".

    -"MEMBRES" contenant (entre autres) les 5 colonnes "MBR_ID","MBR_LIBELLE","MBR_PERE" (MBR_ID du "père" du membre en question),"MBR_PRINC"(booleen) et "MBR_SUPPR" (booleen)

    Avec ces tables (et d'autres) je gère une arborescence de n niveau grâce à la relation parent/enfant => en fait je dois "nourrir" un "treeview"

    En fait je cherche la requête SELECT pour me permettre de créer ce treeview.

    J'avais essayer ça, en sachant que ça ne marcherait pas : Voici le résultat de la requête suivante sur deux tables (dbo.GENERATIONS et dbo.MEMBRES) :

    SELECT dbo.GENERATIONS.GEN_ID,
    dbo.GENERATIONS.LIB_GEN, /*ne pas faire attention à cette colonne
    dbo.GENERATIONS.GEN_NUM,
    dbo.MEMBRES.MBR_ID,
    dbo.MEMBRES.MBR_LIBELLE,
    dbo.MEMBRES.MBR_PERE,
    dbo.MEMBRES.MBR_HIER_TYP,
    dbo.MEMBRES.MBR_SUPPR
    FROM dbo.GENERATIONS,dbo.MEMBRES
    WHERE dbo.GENERATIONS.GEN_ID=dbo.MEMBRES.GEN_ID
    AND dbo.GENERATIONS.AXE_ID='A1'
    ORDER BY MBR_PERE;

    Ca m'a donc donné ceci :

    G1A1 Axe_T 1 MB1 AXE_TARIF NULL 0 0
    G2A1 Hier_T 2 MB22 Hier_P MB1 0 0
    G4A1 Gamme_T 4 MBN Gam_TDR MB2 0 1
    G4A1 Gamme_T 4 MBS3 Gam_T5 MB2 0 1
    G3A1 BU_T 3 MB2B BU_TF MB22 0 1
    G3A1 BU_T 3 MB2E BU_TC MB22 0 1
    G3A1 BU_T 3 MB2 BU_TK MB22 0 1
    G4A1 Gamme_T 4 MBT3 Gam_T8 MB2B 0 1
    G4A1 Gamme_T 4 MBG3 Gam_T2 MB2B 0 1
    G4A1 Gamme_T 4 MBH PB_Gam MB2E 0 1
    G5A1 Tarif 5 MBT5 Trf_P MBG3 0 1
    G5A1 Tarif 5 MB5RX Tarif_BB MBH 0 1
    G5A1 Tarif 5 MBB Tarif_B MBN 0 1
    G5A1 Tarif 5 MBT4 K7_Tarif MBN 0 1
    G5A1 Tarif 5 MBBB TrfKK MBS3 0 1
    G5A1 Tarif 5 MB4Z Tarif_K7 MBT3 0 1
    G5A1 Tarif 5 MB01 Trif_H MBT3 0 1

    En fait, je ne sais pas comment faire le tri suivant : il ya une notion de père et fils (par ex, HIER_P est fils unique de Axe_T, et BU_TC, BU_TK et BU_TF sont des enfants de HIER_P, et ils ont eux mêmes des enfants) dans la 5ème colonne on trouve le nom du père.

    Je voudrais les trier par GEN_NUM mais en arbre en fonction des relations pères fils, ce qui (au niveau Gen_num) devrait donner quelquechose comme ça :

    1Axe_T
    2HIER_P
    3BU_TK
    4MB2B
    5Trf...
    5Trf...
    4MB...
    3BU_TC
    4MB...
    5Trf...
    4etc...
    5etc...
    5

    J'espère avoir été assez clair dans mes explications. Est ce que quelqu'un pourrait m'aider ?

    Merci d'avance pour votre aide,

    Bien Cordialement

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut en fait ...
    En fait, je voudrais ce tri suivant pour être précis :


    G1A1 |Axe_T|1(c GEN_NUM, le Level quoi )|MB1|AXE_TARIF|NULL(c la haut du treeviw, pas de père)|0|0
    G2A1|Hier_T|2|MB22|Hier_P|MB1(c l'ID du Père donc)|0|0
    maintenant les fils et les petites fils de MB22(membre de level2)
    G3A1|BU_T|3|MB2|BU_TK|MB22|0|1
    G4A1|Gamme_T|4|MBN|Gam_TDR|MB2|0|1
    G5A1|Tarif|5|MBB|Tarif_B|MBN|0|1
    G5A1|Tarif|5|MBT4|K7_Tarif|MBN|0|1
    G4A1|Gamme_T|4|MBS3|Gam_T5|MB2|0|1
    G5A1|Tarif|5|MBBB|TrfKK|MBS3|0|1
    G3A1|BU_T|3|MB2B|BU_TF|MB22|0|1
    G4A1|Gamme_T|4|MBG3|Gam_T2|MB2B|0|1
    G5A1|Tarif|5|MBT5|Trf_P|MBG3|0|1
    G4A1|Gamme_T|4|MBT3|Gam_T8|MB2B|0|1
    G5A1|Tarif|5|MB4Z|Tarif_K7|MBT3|0|1
    G5A1|Tarif|5|MB01|Trif_H|MBT3|0|1
    G3A1|BU_T|3|MB2E|BU_TC|MB22|0|1
    G4A1|Gamme_T|4|MBH|PB_Gam|MB2E|0|1
    G5A1|Tarif|5|MB5RX|Tarif_BB|MBH|0|1

    Merci d'avance pour votre aide éventuelle

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Si votre SGBDR le supporte, utilisez le concept de CTE (Common Table Expression) qui permet de réaliser des requêtes récursives.
    Pour de plus amples informations sur cette technique lisez l'article que j'ai écrit à ce sujet :
    http://www.sqlservercentral.com/colu...server2005.asp

    Dans le cas contraire s'il s'agit de voir si votre SGBDR supporte une autre manière de faire cela, par exemple Oracle avec son CONNECT BY / PRIOR.

    Si aucune de ces techniques ne fonctionne sur votre SGBDR, il vous reste deux possibilités :
    1) gérer la récursivité par des appels de SELECT récursif dans votre code (pas génial) ou dans une procédure stockée (mieux).
    2) mais le fin du fin est de rprésenter votre hiérarchie sous forme intervallaire ce qui ote tout récursivité aux requêtes SQL. Dans ce dernier cas, lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/arborescence/

    A +

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Merci
    Merci des conseils

    Je crois que les CTE sont bien supportés sur MS SQL Server 2005 ... encore faut-il que je capte comment ça se construit dans mon cas de figure, car dans l'exemple de l'aide Miscrosoft, en sortie les lignes sont classés par Level, et pas de manière "organigramme" ...

    Je vous tiens au courant, mais en tout cas, merci d'avoir répondu

    PS : pourrais-je revenir vers vous pour quelques questions si je galère avec ce concept ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Envoyez moi votre email en mail privé, je vous donnerais l'aticle cité plus haut et qui concerne SQL Server 2005 en VF.

    Cependant ne comptez pas l'avoir avant ce week end, en effet je suis en déplacement.

    A +

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut C'est ce qu'il faut utiliser c'est sûr ...
    Après "lecture" de ton sujet, je me rends compte que c'est exactement ça qu'il me faut pour mon problème ...

    Par contre étant une bille en anglais, et un calo en SQL je vais avoir du mal ... mais je vais essayer d'adapter ton code à ma problématique.

    Merci

    Pedro

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/06/2009, 17h57
  2. SQL Server 2005 : Mettre en forme son rapport avec Reporting Services
    Par Fleur-Anne.Blain dans le forum Contribuez
    Réponses: 0
    Dernier message: 01/02/2009, 10h55

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