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 :

[Requete SQL] Hierarchie dans une meme table


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Par défaut [Requete SQL] Hierarchie dans une meme table
    Bonjour,

    J'ai une table sous la forme suivante :

    Personne(Id int, Nom varchar, Id_parent int, ...)

    Cette table contient des enregeristrements lié à des personnes, certaines personnes sont parent de certaines autre. Les personnes n'ayant pas de parent on leur 'Id_parent' à NULL.

    Je souhaiterai mettre en place une requête me permetant de retourner toutes les personnes ENFANT, petit enfant, etc... d'une personne donnée.

    NB : Je travail sous MsSql 2005.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Regarde du côté des requêtes récursives.
    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 confirmé
    Inscrit en
    Novembre 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 131
    Par défaut
    Merci al1_24 de m'avoir mis sur la piste.

    Pour les gens que ça intéresse voici un exemple de la solution :

    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
    20
     
    DECLARE @Id_personne int
    SET @Id_personne=1;
     
    WITH Table_CTE(Id, Nom, Niveau) AS 
    (
    SELECT Id, Nom, 0 AS Niveau
    FROM Personne
    WHERE Id_parent=@Id_personne
     
    UNION ALL
     
    SELECT e.Id, e.Nom, Niveau + 1
    FROM Personne e
    INNER JOIN Table_CTE d
    ON e.Id_parent= d.Id
    )
     
    SELECT Id, Nom
    FROM Table_CTE
    Plus de doc sur MSDN...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Par défaut
    Salut jowsuket

    Je ne sais pas si tu existe encore sur ce site.

    J'ai le même problème mais un peu plus compliqué. car je n'ai pas le champ niveau.
    ma table contient seulement 2 champs : Fils et pere

    as tu une autre idée ?

    Merci.
    Citation Envoyé par jowsuket Voir le message
    Merci al1_24 de m'avoir mis sur la piste.

    Pour les gens que ça intéresse voici un exemple de la solution :

    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
    20
     
    DECLARE @Id_personne int
    SET @Id_personne=1;
     
    WITH Table_CTE(Id, Nom, Niveau) AS 
    (
    SELECT Id, Nom, 0 AS Niveau
    FROM Personne
    WHERE Id_parent=@Id_personne
     
    UNION ALL
     
    SELECT e.Id, e.Nom, Niveau + 1
    FROM Personne e
    INNER JOIN Table_CTE d
    ON e.Id_parent= d.Id
    )
     
    SELECT Id, Nom
    FROM Table_CTE
    Plus de doc sur MSDN...

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Sortir de SQL Server 2000, il a dix ans ce SGBD !

    Niveau n'est pas un champ de sa table mais une colonne de la CTE, construite à la volée.

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

Discussions similaires

  1. requete dans une meme table
    Par wade dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/07/2008, 13h33
  2. requete SQL multichamps/dans une liste de valeur
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2006, 15h48
  3. Comment executer une requete sql delete dans une jsp ?
    Par DarkWark dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 24/05/2006, 16h59
  4. [HIBERNATE] lier 2 bases de données dans une même table
    Par bondarenko dans le forum Hibernate
    Réponses: 4
    Dernier message: 31/03/2006, 16h01
  5. 2 auto increment dans une meme table
    Par gesualda dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 12/10/2005, 09h31

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