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

Requêtes et SQL. Discussion :

requete sur niveaux hierarchiques sur une table


Sujet :

Requêtes et SQL.

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut requete sur niveaux hierarchiques sur une table
    Bonjour,

    Je dispose d'une table avec
    un champ IDobjet
    un champ designation
    et un champ Parent.

    Les objets de niveau 1 ont comme parent 0
    On a ensuite des objets qui ont pour parent d'autres objets (maximum 3 niveaux)

    Je cherche à récupérer dans une requete tous les objets de niveau 1
    dans une autre ceux de niveau 2
    idem pour les niveaux 3...

    Et je n'y arrive pas
    Pourriez vous s'il vous plait me guider sur la démarche à suivre ?

    Merci par avance
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Pour récupérer les enregistrements de niveau 1, d'après ce que tu dis, utilise la condition : Parent = 0

    Si tu n'y arrives pas montre nous ton code SQL.

    En espérant t'aider.
    J'aime les gâteaux.

  3. #3
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    oui pour le niveau 1 c'est facile

    ca fonctionne meme tres bien avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) Like 0 Or (Ress.NumParent) Like Null));
    Pour la suite, je n'ai rien à montrer car je ne trouve pas les synthaxes qui vont bien ou peut etre même que la manière de faire que je pense la bonne n'est pas la bonne.

    Je cherche à faire ce qui serait en barbarisme de SQL un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) Like (resultats de Requete1).NumRessource;
    en francais : Prendre les resources dans la table "Ress" qui ont un NumParent egal au NumRessource des éléments résultats de la requete 1.
    La requete 1 etant bien sur la liste des Ressources de niveau 1 décrite au dessus.

    Je n'arrive pas à ecrire ca en SQL

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Tu as donc ceci our le niveau 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL));
    essaie ceci pour le niveau 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT IdObject
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL)));
    et pour le niveau 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.IdObject
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT IdObject
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL))))
    ==> je pense ue tu comprend ce que je veux faire.

    En gros tu dis que pour avoir les objet de niveau 2, il faut que l'id parent de l'objet soit present dans les objet de niveau 1. (utilisation du mot "IN")

    et pour le troisieme niveau et bien il faut simplement que l'id parent de l'objet soit present dans les objet de niveau 2.

    J'espere t'avoir aidé. je ne vois pas d'autre maniere de faire.

    voila

  5. #5
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Je venais annoncer tout fier que je venais d'y arriver en faisant ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT  Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress INNER JOIN RessourcesNiveau1 ON Ress.NumParent = RessourcesNiveau1.NumRessource;
    Mais ce code est bien moins élégant que le tien !! pas besoin d'executer l'autre requete avant déjà...

    Par contre je n'arrive pas à executer ton code, ca me dit qu'il y a une erreur de synthaxe

    Le "SELECT IdObject" kesako ?

    Merci !
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    bien vu !!

    je n'ai pas testé mon code. c'etait pour te mettre sur une piste. Mais je vois que le probleme est resolu.

  7. #7
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    merci mais j'aimerai bien comprendre ce que tu m'as proposé

    il y a surement un micro bug

    IN j'arrive à rouver des choses

    mais Idobject je n'arrive pas à trouver ce que ca represente

    merci encore
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    je cite ce que tu avais ecris :

    Je dispose d'une table avec
    un champ IDobjet
    un champ designation
    et un champ Parent.
    Mais en fait je pense que les correspondance sont les suivantes :
    IdObjet -> Ress.NumRessource
    designation -> Ress.[LIB1-20]
    Parent -> Ress.NumParent

    en fait IdObjet que j'ai marqué, je pense qu'il correspond à ton numRessource. C'est juste une petite erreur de ma part.

    Remplace alors idObjet par numRessource

    Le principe est le suivant :

    Tout d'abord tu cherche les objets de niveau 1 par la requete suivante. Celle que tu utilise d'ailleur. Appelons cette requete rqt_niveau1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL));

    Ensuite on veux les objets de niveau 2. C'est a dire que l'on veut recuperer les objet ayant des parents de niveau 1. ce qui signifie que le numParent de ces objets doit correnspondre à l'un des objets issu de rqt_niveau1.

    On a donc la requete suivante ( que l'on appelera rqt_niveau2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL)));
    note : la requete en bleu correspond bien evidemment à la requete de niveau 1 où l'on a seulement selectionné le numero des objets.

    Enfin, On fait de même pour les objets de niveau 3. C'est a dire que l'on recupere les objets ayant des parents de niveau 2. ce qui signifie que le numParent de ces objets doit correnspondre à l'un des objets issu de rqt_niveau2.

    Donc voici ce que cela donnerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Ress.[LIB1-20], Ress.NumParent,Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL))))
    note : la requete en vert correspond quand à elle à la requete de niveau 2 où l'on a seulement selectionné le numero des objets.

    Bon je pense avoir été assez clair. Tient moi au courant si tu comprend mon raisonnement ou pas.

  9. #9
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    les virgules sont un peu en vrac dan l'exempel mais j'ai trés bien pigé, on ne peut pas faire plus clair !

    Au final ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Ress.[LIB1-20], Ress.NumParent, Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL)))));
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Ress.[LIB1-20], Ress.NumParent, Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) IN 
    (SELECT Ress.NumRessource
    FROM Ress
    WHERE (((Ress.NumParent) LIKE 0 OR (Ress.NumParent) LIKE NULL))))))));
    Merci mille fois ! je vais pouvoir me coucher moins idiot ce soir !
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

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

Discussions similaires

  1. [AC-2003] ACCESS requete sur champs inexistant dans une table
    Par marlauc dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 02/12/2011, 10h14
  2. Requete sur le nom d'une table.
    Par LyLy_91 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/07/2007, 11h31
  3. [WD9] Cliquer sur des enregistrements dans une table
    Par oz80 dans le forum WinDev
    Réponses: 2
    Dernier message: 15/12/2005, 20h11
  4. Question sur la création d'une table
    Par air dans le forum Oracle
    Réponses: 4
    Dernier message: 23/10/2005, 12h46
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

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