Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 02/02/2011, 14h35   #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 [SQL SERVER 2008]Pourquoi cette requete marche ? xD

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)
et ca me donne le bon résultat ...
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 ?
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h11   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 15h43   #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
le problème c'est que

Citation:
1/ Vous récupérez dans la table T_ARBO_PRG, les PRG_ID pour toutes les lignes où HC_ID = 2
dans T_ARBO_PRG il n'y a pas de HC_ID
Mais elle est dans PRG_HC...
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 17h09   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par lerieure Voir le message
le problème c'est que

dans T_ARBO_PRG il n'y a pas de HC_ID
Mais elle est dans PRG_HC...
Je n'avais pas vu cette subtilité dans votre description...
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 :
1
2
3
4
5
6
7
8
 
SELECT 
    PRG_ID 
FROM PRG_HC 
WHERE PRG_ID IN (
    SELECT HC_ID 
    FROM T_ARBO_PRG 
)

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 :
1
2
3
4
5
6
7
 
SELECT 
    PRG_ID 
FROM PRG_HC 
WHERE PRG_ID IN (
    SELECT HC_ID 
)
équivalent à
Code sql :
1
2
3
4
5
 
SELECT 
    PRG_ID 
FROM PRG_HC 
WHERE PRG_ID IN (HC_ID)

équivalent à (sur la logique de la requete tout du moins)
Code sql :
1
2
3
4
5
 
SELECT 
    PRG_ID 
FROM PRG_HC 
WHERE PRG_ID = HC_ID


Donc votre requete initiale est équivalente à :
Code sql :
1
2
3
4
5
6
 
SELECT 
    PRG_ID 
FROM PRG_HC 
WHERE PRG_ID IN (SELECT PRG_ID FROM T_ARBO_PRG )
AND HC_ID=2
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2011, 17h13   #5
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 878
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 878
Points : 7 655
Points : 7 655
Citation:
Envoyé par lerieure Voir le message
le problème c'est que



dans T_ARBO_PRG il n'y a pas de HC_ID
Mais elle est dans PRG_HC...
Dans ce cas, la requete ne devrait pas marcher.

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
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 19h20   #6
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
Marche pas toute seule
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h33.


 
 
 
 
Partenaires

Hébergement Web