Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/02/2011, 09h44   #1
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
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 :
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
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 10h13   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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é).
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 10h22   #3
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
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...
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 11h38   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 13h31   #5
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77


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 ....
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 09h49   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 10h42   #7
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
J'ai changé le post du haut...
J'espère que c'est plus clair
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 10h49   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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) ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 11h35   #9
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
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
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 11h52   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Ok, j'ai compris, vous n'étiez pas loin de la solution.

Code :
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 14h36   #11
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
Code :
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
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 20h07   #12
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h43.


 
 
 
 
Partenaires

Hébergement Web