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 sur l'arborescence intervallaire : selectionner les bouts de branche


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut Requete sur l'arborescence intervallaire : selectionner les bouts de branche
    Bonjour,

    je voudrais sélectionner par rapport à une liste d'élément les bouts de banche

    par exemple pour un élément je dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT PLN_ID FROM T_ARBO_PLN WHERE 
    PLN_BD-PLN_BG=1 
    AND PLN_BG >= (SELECT PLN_BG FROM T_ARBO_PLN WHERE PLN_ID=2) 
    AND PLN_BD <= (SELECT PLN_BD FROM T_ARBO_PLN WHERE PLN_ID=2)
    pour mon élément avec l'id 2

    mais si j'ai 2,4,6 et je voudrais récupérer leur bout de branche comment je fais ?

    je peux faire une une requête dynamique avec une boucle pour chaque élément mais si j'ai une liste de 100 éléments la boucle risque d'être lourde...
    Avez vous une idée ?

    Ma table possède aussi le LEVEL de l'élément
    voici le récap de la table
    T_ARBO_PLN :
    PLN_ID
    PLN_BG
    PLN_BD
    LEVEL

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    par level tu entend le niveau de ta ligne dans l'arbre ?

    Si c'est le cas il faudra tester la non existence d'un niveau strictement supérieur (ou inf je ne sais pas comment tu as modélisé).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par punkoff Voir le message
    par level tu entend le niveau de ta ligne dans l'arbre ?

    Si c'est le cas il faudra tester la non existence d'un niveau strictement supérieur (ou inf je ne sais pas comment tu as modélisé).
    oui, c'est le niveau dans l'arbre

    je l'ai modélisé par le cours de SQLpro donc de cette maniere (représentation graphique) http://sqlpro.developpez.com/cours/arborescence/

    je vois pas le test à faire...

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    hmm ok,

    c'est plus simple que ca.
    Dans votre arbre les feuilles semblent être reconnu via la condition suivante :
    PLN_BD - PLN_BG = 1

    Par contre, ceci sera faux si quand vous supprimer des lignes de votre arbre vous ne réordonnancé pas vos plage gauche / droite.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut


    Si ma requête possède les id suivants: (sélect id from x )
    id libelle
    01 aérien
    02 marin

    je veux avoir comme résultat : ( sélect id as boutdebranche from t_arbo where id in (sélect id from x) and ... (des trucs qui vont récupérer les bouts de branches de ces id)

    planeur, parachute, hélico, fusée, ULM, civil, touriste, militaire, voilier, paquebot, planche à voile


    J'arrive pas à trouver ....

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Alors, je ne comprend pas ce que vous voulez pour 2 raisons :
    - votre schéma diffère de celui donné dans l'exemple. En effet vos table ont des colonnes supplémentaires et vous disposez de table qui ne sont pas indiqué dans l'exemple de sql pro.
    - Il manque un petit jeu de donnée pour comprendre vos interaction entre vos tables

    Donc je ne pige que dalle à votre exemple, et vu que j'ai un rhume ca n'arrange pas les choses :p

    Donnez un petit jeu de donnée (en entrée) + résultat attendu et ca devrait le faire.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    J'ai changé le post du haut...
    J'espère que c'est plus clair

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Dans votre exemple, votre 1ere requête ramène transport, aérien, marin.

    transport englobe tout l'arbre, est-ce normal que vous ne vouliez pas les bouts d'arbre qui se rattachent à terrestre ?

    Je ne vois pas la logique la dedans.

    Vous ne voulez que les bouts d'arbre des résultats à partir du 2eme niveau (si transport est le niveau 1) ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Arf, je suis null, je rectifie mon erreur... Il n'y a pas transport ! Je veux retourner tous les bouts de branches des id que me ramène la requête donc s'il retourne transport alors il retournera tous les bouts de branches en effet

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Ok, j'ai compris, vous n'étiez pas loin de la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select a.* 
    from T_ARBO_PLN a
    where pln_bd - pln_bg = 1 
    and exists (select 1 from T_ARBO_PLN b where id in (8, 19) 
    and a.pln_bg >= b.pln_bg and a.pln_bd <= b.pln_bd);
    remplacer mon "id in (8, 19)" par une jointure sur votre autre table qui recense
    vos différents ID, ou par une sous-requete.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT distinct PLN_ID FROM T_ARBO_PLN PLN, 
    (SELECT distinct PLAN_ID, PLN_BG, PLN_BD   FROM T_DEV_TEMP TP 
    INNER JOIN TEMPLATE T ON TP.ID=T.TEMPLATE_ID 
    INNER JOIN T_ARBO_PLN PL ON T.PLAN_ID=PL.PLN_ID WHERE PLAN_ID IS NOT NULL) RULES 
    WHERE PLN.PLN_BD-PLN.PLN_BG=1 
    AND  PLN.PLN_BG >=  RULES.PLN_BG
    AND PLN.PLN_BD <= RULES.PLN_BD
    J'ai trouvé une autre requete moins couteuse... d'après le SQL Profiler elle lirait deux fois moins de page

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    moins de page fault ?

    dans ma requête je fais un select *, si vous ne mettez que l'id du plan (pas besoin du distinct en plus) c'est toujours le cas ?

    J'ai un gros doute quand même, au niveau de la rapidité d'execution, car votre requête inclu 2 distincts.

    Du moins sur db2 l'optimizer me sort un plan d'acces plus rapide, apres sur sql serveur c'est peut etre différent.

    sinon niveau indexation, j'ai testé de cette maniere :
    template index sur l'id
    T_ARBO_PLN index sur id, pln_bg, pln_bd

    Je n'ai pas modélisé votre 3eme table ne sachant pas ce qu'il y avait dedans.

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

Discussions similaires

  1. Requete sur un champ et évitez les doublons
    Par adien.fanget dans le forum Débuter
    Réponses: 5
    Dernier message: 23/03/2009, 08h35
  2. une requete sur les chaines
    Par Ludo75 dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/04/2007, 09h41
  3. Requete sur plusieurs tables contenant les mêmes champs
    Par Louison dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/04/2007, 20h41
  4. Requete sur les dates
    Par innova dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/02/2007, 14h18
  5. Réponses: 2
    Dernier message: 25/09/2006, 13h04

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