|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Olivier Albertini Inscription : avril 2006 Messages : 194 ![]() |
Bonjour,
Je suis sous MS SQL SERVER 2008 et je fais cette requete Code :
SELECT PRG_ID FROM PRG_HC WHERE PRG_ID IN (SELECT PRG_ID FROM T_ARBO_PRG WHERE HC_ID=2) PRG_HC possède HC_ID et PRG_ID qui sont PRIMARY KEY T_ARBO_PRG possède PRG_ID PRIMARY KEY (SELECT PRG_ID FROM T_ARBO_PRG WHERE HC_ID=2) Comment fait il le lien ? j'ai pas fait de JOIN... Fait t-il une liaison implicite ? |
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Ça marche ? alors surtout, ne touchez plus à rien ! Découpons votre requete en deux, en commençant par la requete dans la IN : 1/ Vous récupérez dans la table T_ARBO_PRG, les PRG_ID pour toutes les lignes où HC_ID = 2 2/ Ensuite, vous récupérez dans la table PRG_HC les PRG_ID qui sont contenu dans le résultat de votre sous requete (IN) La requete globale vous renvoi donc littéralement : tous les PRG_ID présents dans la table PRG_HC, et qui sont également présents dans la table T_ARBO_PRG avec au moins un ligne par PRG_ID où HC_ID = 2 Je ne sais pas si j'ai été clair ! (c'est déjà pas toujours facile d'expliquer pourquoi ça ne fonctionne pas, alors expliquer pourquoi ca fonctionne... Cela dit, il serait en effet mieux de faire une jointure entre vos deux tables, et vous devriez obtenir le même résultat... |
|
|
00
|
|
|
#3 | |
|
Membre régulier
![]() Olivier Albertini Inscription : avril 2006 Messages : 194 ![]() |
le problème c'est que
Citation:
Mais elle est dans PRG_HC... |
|
|
00
|
|
|
#4 | |||||||||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Et j'avais donc mal compris le sens de votre question Donc : La réponse est oui, bien que je ne sais pas si on peut vraiment parler de "liaison implicite" Telle que votre requete est écrite, c'est la valeur de la colonne HC_ID de la table PRG_HC qui est évaluée. Votre filtre est évalué pour chaque ligne de la table PRG_HC, et donc chaque colonne de cette table peut prendre place dans votre filtre. Cette requete (bien que particulièrement absurde) fonctionnerait aussi d'ailleurs : Code sql :
Elle vous renverrait toutes les lignes de PRG_HC où PRG_ID = HC_ID (pour peu que T_ARBO_PRG contienne au moins une ligne) Car au moment de l'évaluation du filtre, HC_ID a bien une valeur, celle colonne HC_ID de la ligne pour laquelle le filtre est évalué. Bien sur, dans votre requete initiale, si T_ARBO_PRG avait eut une colonne HC_ID, c'est la colonne de cette table qui aurait été prise en compte dans le filtre de la sous requete... D'autres exemples de requêtes pour mieux comprendre le mécanisme (une courte requete vaut mieux qu'un long discours.. Code sql :
Code sql :
équivalent à (sur la logique de la requete tout du moins) Code sql :
Donc votre requete initiale est équivalente à : Code sql :
|
|||||||||||
|
|
10
|
|
|
#5 | |
![]() ![]() Yves Développeur informatique Inscription : janvier 2007 Messages : 3 878 ![]() |
Citation:
Essaye d'exécuter la requete du IN toute seule pour voir.
__________________
Sevyc64 --- Le partage est notre force NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS |
|
|
|
00
|
|
|
#6 |
|
Membre régulier
![]() Olivier Albertini Inscription : avril 2006 Messages : 194 ![]() |
Marche pas toute seule
|
|
00
|
Copyright © 2000-2012 - www.developpez.com